Apa perintah ringkas yang dapat saya gunakan untuk menemukan semua file yang TIDAK mengandung string teks?
Saya mencoba ini (menggunakan -v untuk membalikkan parameter grep) tanpa hasil:
find . -exec grep -v -l shared.php {} \;
Seseorang berkata ini akan berhasil:
find . ! -exec grep -l shared.php {} \;
Tetapi sepertinya itu tidak berhasil untuk saya.
Halaman ini memiliki contoh ini:
find ./logs -size +1c > t._tmp
while read filename
do
grep -q "Process Complete" $filename
if [ $? -ne 0 ] ; then
echo $filename
fi
done < t._tmp
rm -f t_tmp
Tapi itu rumit dan sama sekali tidak ringkas.
ps: Saya tahu itu grep -L *
akan melakukan ini, tetapi bagaimana saya bisa menggunakan perintah find dalam kombinasi dengan grep ke file yang dikecualikan adalah apa yang benar-benar ingin saya ketahui.
pss: Juga saya tidak yakin bagaimana agar grep menyertakan subdirektori dengan grep -L *
sintaks, tetapi saya masih ingin tahu bagaimana menggunakannya dengan find
:)
Jawaban:
ATAU
Di sini kita menghitung jumlah baris yang cocok (menggunakan
-c
) dalam file jika jumlah adalah 0 maka file yang diperlukan, jadi kami memotong kolom pertama yaitu nama file dari output.sumber
grep
itu diperbaiki ini masih akan menganggap tidak ada nama file yang mengandung:
atau karakter baris baru ...Temuan Anda akan berfungsi jika Anda mengubah
-v -l
(file yang memiliki baris yang tidak cocok) ke-L
(file tanpa baris yang cocok), tetapi Anda juga bisa menggunakan opsigrep
rekursif (-r
):sumber
find . -exec grep -v -l shared.php {} \;
(dan semua varian lain yang saya coba) tidak berfungsi untuk saya. Saya menggunakan OS X tapi saya pikir itu tidak masalah. Saya memberi Anda +1 karena saya lupa tentang-r
opsi itu.-L
Anda bisa menggunakan
find
dangrep
menyukai ini:Di sini
-print
dieksekusi hanya jika ekspresi sebelumnya:! -exec ... {}
dievaluasi sebagaitrue
.Jadi untuk setiap file yang ditemukan,
grep -q 'PATTERN'
adalahexec
usikan, jika hasilnya adalahfalse
maka seluruh ekspresi! -exec grep -q 'PATTERN'
mengevaluasi sebagaitrue
dan nama fileprint
ed.sumber
grep -L
juga akan menyertakan file yang tidak dapat dibaca dalam daftar.Anda menemukan tidak cocok hasil dengan opsi -L
sumber
Saya pikir Anda mencari perintah seperti
Opsi ini
-q
membuatgrep
berhenti dan setelah menggunakan-execdir
Anda perlu-print
mencetak file yang ditemukan.sumber