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 greptidak dapat membaca nama file untuk mencari dari input standar. Apa yang Anda lakukan adalah mencetak nama file yang mengandung XYZ. Menggunakanfind 's -execpilihan 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 -ike 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 XYZdirektori. Di sisi lain, … | grep 'XYZ'berarti mencari polanyaXYZ dalam grepinput standar. \
Pada Mac OS X atau BSD, grepakan diperlakukan XYZsebagai pola, dan mengeluh:
$ echo XYZ | grep -R 'XYZ'
grep: warning: recursive search of stdin
(standard input):XYZ
GNU greptidak 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 XYZnama file yang cocok.
Perhatikan, bagaimanapun, bahwa spasi putih dalam nama file akan menyebabkan dua perintah itu rusak. Anda dapat menggunakan xargsdengan 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
findseperti yang ditunjukkan dalam beberapa jawaban lainnya.