Temukan file yang berisi string dalam nama file dan string berbeda di dalam file?

17

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.

pengguna997112
sumber

Jawaban:

26

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' {} +
terdon
sumber
2

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
R. Oosterholt
sumber
1

… | 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.

200_sukses
sumber
-1

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

Periya Samy
sumber
Ini hanya sebagian jawaban karena tidak pernah membahas bagian "pencarian di dalam file" dari pertanyaan. Ini juga jauh lebih efisien untuk menggunakan pola globbing nama file, mungkin dalam kombinasi dengan findseperti yang ditunjukkan dalam beberapa jawaban lainnya.
Kusalananda