Ben ("özyinelemeli)" ABC "ile tüm dosyaları kendi dosya adında, aynı zamanda dosyada" XYZ "içeren bulmak istiyorum. Denedim:
find . -name "*ABC*" | grep -R 'XYZ'
ama doğru çıktı vermiyor.
Ben ("özyinelemeli)" ABC "ile tüm dosyaları kendi dosya adında, aynı zamanda dosyada" XYZ "içeren bulmak istiyorum. Denedim:
find . -name "*ABC*" | grep -R 'XYZ'
ama doğru çıktı vermiyor.
Yanıtlar:
Bunun nedeni grep
, standart girdiden aramak için dosya adlarını okuyamamasıdır. Yaptığınız şey , içerdiği dosya adlarını yazdırmak XYZ
. Kullanım find
'ın -exec
seçeneği yerine:
find . -name "*ABC*" -exec grep -H 'XYZ' {} +
Gönderen 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.
Gerçek eşleşen satırlara değil, yalnızca dizenin en az bir örneğini içeren dosya adlarının listesine ihtiyacınız varsa, bunun yerine şunu kullanın:
find . -name "*ABC*" -exec grep -l 'XYZ' {} +
Aşağıdaki komutu en basit yolu buluyorum:
grep -R --include="*ABC*" XYZ
veya -i
duyarsız arama durumuna ekle :
grep -i -R --include="*ABC*" XYZ
… | grep -R 'XYZ'
Anlamsız. Bir yandan, dizinde -R 'XYZ'
yinelemeli olarak hareket etmek anlamına gelir XYZ
. Öte yandan, … | grep 'XYZ'
araçlar desen aramaya XYZ
içinde grep
'nin standart girdi. \
Mac OS X veya BSD'de desen olarak grep
ele alınır XYZ
ve şikayet eder:
$ echo XYZ | grep -R 'XYZ'
grep: warning: recursive search of stdin
(standard input):XYZ
GNU grep
şikayet etmeyecek. Daha ziyade, XYZ
bir desen gibi davranır , standart girişini yoksayar ve geçerli dizinden başlayarak özyinelemeli arama yapar.
Yapmak istediğin şey muhtemelen
find . -name "*ABC*" | xargs grep -l 'XYZ'
… Buna benzer
grep -l 'XYZ' $(find . -name "*ABC*")
… Her ikisi de eşleşen dosya adlarında arama grep
yapmayı söyler XYZ
.
Ancak, dosya adlarındaki boşlukların bu iki komutun bozulmasına neden olacağını unutmayın. Sınırlayıcı olarak xargs
kullanarak güvenle kullanabilirsiniz NUL:
find . -name "*ABC*" -print0 | xargs -0 grep -l 'XYZ'
Ancak @ terdon'un find … -exec grep -l 'XYZ' '{}' +
kullanımı daha basit ve daha iyidir.
Linux Yorum: ll -iR | grep "dosya adı"
örnek: Bookname.txt sonra ll -iR | grep "Kitap adı" veya ll -iR | grep "ad" veya ll -iR | grep "Kitap"
dosya adının bir kısmı ile arama yapabiliriz.
Bu, geçerli ve alt klasörlerden eşleşen tüm dosya adlarını listeler
find
diğer yanıtların bazılarında gösterildiği gibi , dosya adı globbing desenlerini kullanmak da çok daha etkilidir .