Saya ingin (secara rekursif) menemukan semua file dengan "ABC" dalam nama file mereka, yang juga mengandung "XYZ" dalam file tersebut. Saya mencoba:
find . -name "*ABC*" | grep -R 'XYZ'
tetapi tidak memberikan output yang benar.
Saya ingin (secara rekursif) menemukan semua file dengan "ABC" dalam nama file mereka, yang juga mengandung "XYZ" dalam file tersebut. Saya mencoba:
find . -name "*ABC*" | grep -R 'XYZ'
tetapi tidak memberikan output yang benar.
Jawaban:
Itu karena grep
tidak dapat membaca nama file untuk mencari dari input standar. Apa yang Anda lakukan adalah mencetak nama file yang mengandung XYZ
. Menggunakanfind
's -exec
pilihan gantinya:
find . -name "*ABC*" -exec grep -H 'XYZ' {} +
Dari man find
:
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;' is encountered. The string `{}'
is replaced by the current file name being processed everywhere
it occurs in the arguments to the command, not just in arguments
where it is alone, as in some versions of find.
[...]
-exec command {} +
This variant of the -exec action runs the specified command on
the selected files, but the command line is built by appending
each selected file name at the end; the total number of invoca‐
tions of the command will be much less than the number of
matched files. The command line is built in much the same way
that xargs builds its command lines. Only one instance of `{}'
is allowed within the command. The command is executed in the
starting directory.
Jika Anda tidak membutuhkan baris yang cocok sebenarnya tetapi hanya daftar nama file yang mengandung setidaknya satu kemunculan string, gunakan ini sebagai gantinya:
find . -name "*ABC*" -exec grep -l 'XYZ' {} +
Saya menemukan perintah berikut dengan cara paling sederhana:
grep -R --include="*ABC*" XYZ
atau tambahkan -i
ke pencarian tidak sensitif huruf:
grep -i -R --include="*ABC*" XYZ
… | grep -R 'XYZ'
tidak masuk akal. Di satu sisi, -R 'XYZ'
berarti bertindak secara rekursif pada XYZ
direktori. Di sisi lain, … | grep 'XYZ'
berarti mencari polanyaXYZ
dalam grep
input standar. \
Pada Mac OS X atau BSD, grep
akan diperlakukan XYZ
sebagai pola, dan mengeluh:
$ echo XYZ | grep -R 'XYZ'
grep: warning: recursive search of stdin
(standard input):XYZ
GNU grep
tidak akan mengeluh. Sebaliknya, itu memperlakukanXYZ
sebagai pola, mengabaikan input standarnya, dan pencarian secara rekursif dimulai dari direktori saat ini.
Apa yang ingin Anda lakukan mungkin
find . -name "*ABC*" | xargs grep -l 'XYZ'
... yang mirip dengan
grep -l 'XYZ' $(find . -name "*ABC*")
... keduanya mengatakan grep
untuk mencari XYZ
nama file yang cocok.
Perhatikan, bagaimanapun, bahwa spasi putih dalam nama file akan menyebabkan dua perintah itu rusak. Anda dapat menggunakan xargs
dengan aman dengan menggunakan NULsebagai pembatas:
find . -name "*ABC*" -print0 | xargs -0 grep -l 'XYZ'
Tetapi menggunakan solusi @ terdon find … -exec grep -l 'XYZ' '{}' +
lebih sederhana dan lebih baik.
Linux Menyarankan: ll -iR | grep "nama file"
mis: Bookname.txt kemudian gunakan ll -iR | grep "Bookname" atau ll -iR | grep "name" atau ll -iR | grep "Buku"
kita dapat mencari dengan bagian dari nama file.
Ini akan mencantumkan semua nama file yang cocok dari folder saat ini dan sub
find
seperti yang ditunjukkan dalam beberapa jawaban lainnya.