Penggunaan xargs dalam jawaban di atas tidak diperlukan; Anda dapat mencapai hal yang sama seperti ini:
find . -type f -exec grep -q <string-to-match> {} \; -not -exec grep -q <string-not-to-match> {} \; -print
grep -q
berarti jalankan dengan tenang tetapi kembalikan kode keluar yang menunjukkan apakah kecocokan ditemukan; find
kemudian dapat menggunakan kode keluar itu untuk menentukan apakah akan tetap menjalankan sisa opsinya. Jika -exec grep -q <string-to-match> {} \;
mengembalikan 0, lalu akan mengeksekusi -not -exec grep -q <string-not-to-match>{} \;
. Jika itu juga mengembalikan 0, itu akan mengeksekusi -print
, yang mencetak nama file.
Seperti yang dicatat oleh jawaban lain, menggunakan find
dengan cara ini memiliki keunggulan besar dibandingkan grep -Rl
di mana Anda hanya ingin mencari file dari jenis tertentu. Sebaliknya, jika Anda benar-benar ingin mencari semua file, grep -Rl
mungkin lebih cepat, karena menggunakan satu grep
proses untuk melakukan filter pertama untuk semua file, bukan grep
yang terpisah proses untuk setiap file.
Coba ini:
grep -rl <string-to-match> | xargs grep -L <string-not-to-match>
Penjelasan:grep -lr
membuat grep secara rekursif (r) menampilkan daftar (l) dari semua file yang berisi <string-to-match>
. xargs mengulang file-file ini, memanggil grep -L
pada masing-masing dari mereka. grep -L
hanya akan mengeluarkan nama file ketika file tidak mengandung <string-not-to-match>
.
Jawaban-jawaban ini sepertinya cocok BOTH string. Perintah berikut seharusnya bekerja lebih baik:
grep -l <string-to-match> * | xargs grep -c <string-not-to-match> | grep '\:0'