Dengan alat GNU:
find . -type f -exec grep -lZ FIND {} + | xargs -r0 grep -l ME
Anda dapat melakukannya secara standar:
find . -type f -exec grep -q FIND {} \; -exec grep -l ME {} \;
Tapi itu akan menjalankan dua greps per file. Untuk menghindari menjalankan yang banyak grep
dan masih dapat dibawa-bawa sementara masih memungkinkan karakter apa pun dalam nama file, Anda dapat melakukan:
convert_to_xargs() {
sed "s/[[:blank:]\"\']/\\\\&/g" | awk '
{
if (NR > 1) {
printf "%s", line
if (!index($0, "//")) printf "\\"
print ""
}
line = $0
}'
END { print line }'
}
find .//. -type f |
convert_to_xargs |
xargs grep -l FIND |
convert_to_xargs |
xargs grep -l ME
Gagasannya adalah untuk mengubah output find
menjadi format yang cocok untuk xargs (yang mengharapkan blank (SPC / TAB / NL, dan blank lainnya dari lokal Anda dengan beberapa implementasi xargs
) daftar kata-kata yang terpisah di mana single, double quotes dan backslash dapat melarikan diri kosong dan satu sama lain).
Secara umum Anda tidak dapat memposting proses keluaran find -print
, karena memisahkan nama file dengan karakter baris baru dan tidak lepas dari karakter baris baru yang ditemukan dalam nama file. Sebagai contoh jika kita melihat:
./a
./b
Kami tidak punya cara untuk mengetahui apakah itu satu file yang dipanggil b
dalam direktori yang disebut a<NL>.
atau apakah itu dua file a
dan b
.
Dengan menggunakan .//.
, karena //
tidak dapat muncul sebaliknya di jalur file sebagai keluaran oleh find
(karena tidak ada yang namanya direktori dengan nama kosong dan /
tidak diizinkan dalam nama file), kita tahu bahwa jika kita melihat baris yang berisi //
, maka itu baris pertama dari nama file baru. Jadi kita bisa menggunakan awk
perintah itu untuk menghindari semua karakter baris baru tetapi yang mendahului baris-baris itu.
Jika kita mengambil contoh di atas, find
akan menampilkan dalam kasus pertama (satu file):
.//a
./b
Awk yang lolos ke:
.//a\
./b
Sehingga xargs
melihatnya sebagai satu argumen. Dan dalam kasus kedua (dua file):
.//a
.//b
Yang awk
akan pergi apa adanya, jadi xargs
melihat dua argumen.