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'