Bagaimana cara mengetahui file dalam direktori saat ini yang tidak mengandung kata foo
(menggunakan grep
)?
536
Jika grep Anda memiliki opsi -L
(atau --files-without-match
):
$ grep -L "foo" *
GREP_OPTIONS='--exclude-dir=.svn --exclude-dir=.git'
: ^)ag -L 'foo'
-rL
alih-alih-L
untuk mencocokkan subdirektorigrep -L 'foo' -- *
adalah bahwa perintah yang mengambil opsi lama gunakan--
untuk menunjukkan bahwa tidak ada opsi lagi setelah titik ini.Lihatlah
ack
. Itu.svn
pengecualian untuk Anda secara otomatis, memberi Anda ekspresi reguler Perl, dan merupakan unduhan sederhana dari satu program Perl.Setara dengan apa yang Anda cari seharusnya, di
ack
:sumber
Anda dapat melakukannya dengan grep saja (tanpa menemukan).
Ini adalah penjelasan tentang parameter yang digunakan
grep
Jika Anda menggunakan
l
(huruf kecil) Anda akan mendapatkan yang sebaliknya (file dengan kecocokan)sumber
Perintah berikut memberi saya semua file yang tidak mengandung pola
foo
:sumber
grep '0$'
akan cocok dengan file dengan kelipatan 10 baris juga! Anda harusgrep ':0$'
di akhir untuk memeriksa ': 0' secara eksplisit di akhir baris. Maka Anda hanya akan mendapatkan file dengan garis nol yang cocok.Perintah berikut tidak termasuk kebutuhan untuk menemukan untuk menyaring
svn
folder dengan menggunakan yang keduagrep
.sumber
Anda benar-benar membutuhkan:
sumber
Saya beruntung dengan
Upaya saya dengan
grep -v
hanya memberi saya semua baris tanpa "foo".sumber
Masalah
Saya perlu memperbaiki proyek besar yang menggunakan
.phtml
file untuk menulis HTML menggunakan kode PHP sebaris. Saya ingin menggunakan template Moustache sebagai gantinya. Saya ingin menemukan.phtml
gile yang tidak mengandung stringnew Mustache
karena ini masih perlu ditulis ulang.Larutan
find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'
Penjelasan
Sebelum pipa:
Temukan
find .
Temukan file secara rekursif, mulai dari direktori ini-iname '*.phtml'
Nama file harus mengandung.phtml
(thei
make case-insensitive)-exec 'grep -H -E -o -c 'new Mustache' {}'
Jalankangrep
perintah di setiap jalur yang cocokGrep
-H
Selalu cetak header nama file dengan jalur output.-E
Menafsirkan pola sebagai ekspresi reguler yang diperluas (yaitu memaksa grep untuk berperilaku sebagai egrep).-o
Hanya mencetak bagian garis yang cocok.-c
Hanya hitungan baris yang dipilih ditulis ke output standar.Ini akan memberi saya daftar semua jalur file yang diakhiri
.phtml
, dengan hitungan berapa kali stringnew Mustache
muncul di masing-masing jalur tersebut .Pipa pertama
grep :0$
menyaring daftar ini untuk hanya menyertakan garis yang diakhiri dengan:0
:Pipa kedua
sed 's/..$//'
melepas dua karakter terakhir dari setiap baris, hanya menyisakan path file.sumber
Jika Anda menggunakan git, ini mencari semua file yang dilacak:
dan Anda dapat mencari di subset file yang dilacak jika Anda memiliki ** subdirektori globbing dihidupkan (
shopt -s globstar
dalam .bashrc, lihat ini ):sumber
Grep saya tidak memiliki opsi -L. Saya menemukan solusi untuk mencapai ini.
Gagasannya adalah:
buat perbedaan antara 2 dump file dengan perintah diff.
sumber
diff
antara dua aliran output (saya pikir Anda mengelilingi perintah dengan tanda kurung, dan ada kurung sudut di suatu tempat juga), jika sistem Anda mendukungnya, yang saya kira adalah pertanyaannya, karena itu tidak mendukunggrep -L
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
Anda dapat menentukan filter di bawah "find" dan string pengecualian di bawah "grep -vwE". Gunakan mtime di bawah find jika Anda juga perlu memfilter waktu yang dimodifikasi.
sumber
Buka laporan bug
Seperti yang dikomentari oleh @tukan, ada laporan bug terbuka untuk Ag mengenai
-L
/--files-without-matches
flag:--files-without-matches
tidak berfungsi dengan baikKarena ada sedikit kemajuan pada laporan bug,
-L
opsi yang disebutkan di bawah ini tidak boleh diandalkan , tidak selama bug belum diselesaikan. Gunakan pendekatan berbeda yang disajikan dalam utas ini sebagai gantinya. Mengutip komentar untuk laporan bug [penekanan milik saya]:The Silver Searcher - Ag (fungsi yang dituju - lihat laporan bug)
Sebagai alternatif yang kuat untuk
grep
, Anda bisa menggunakan The Silver Searcher - Ag :Melihat
man ag
, kami menemukan opsi-L
atau--files-without-matches
:Yakni, untuk mencari file yang tidak cocok secara rekursif
foo
, dari direktori saat ini:Untuk hanya mencari direktori saat ini untuk file yang tidak cocok
foo
, cukup tentukan--depth=0
untuk rekursi:sumber
-L
bug - github.com/ggreer/the_silver_searcher/issues/238alternatif lain ketika grep tidak memiliki opsi -L (misalnya IBM AIX), dengan grep dan shell:
sumber
atau
perintah di atas akan memberi kita hasilnya karena -v menemukan kebalikan dari pola yang dicari
sumber
-l
opsi untuk mencetak hanya nama file; tetapi ini masih mencetak nama-nama file yang berisi baris apa pun yang tidak mengandung pola. Saya percaya OP ingin menemukan file yang tidak mengandung garis apa pun yang berisi pola.Perintah berikut ini dapat membantu Anda untuk memfilter garis yang menyertakan "foo" substring.
sumber
cat
.