Dosya adında dize ve dosya içinde farklı dize içeren dosyalar mı buldunuz?


17

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:


26

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 -execseç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' {} +

2

Aşağıdaki komutu en basit yolu buluyorum:

grep -R --include="*ABC*" XYZ

veya -iduyarsız arama durumuna ekle :

grep -i -R --include="*ABC*" XYZ

1

… | 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 XYZiçinde grep'nin standart girdi. \

Mac OS X veya BSD'de desen olarak grepele alınır XYZve şikayet eder:

$ echo XYZ | grep -R 'XYZ'
grep: warning: recursive search of stdin
(standard input):XYZ

GNU grepşikayet etmeyecek. Daha ziyade, XYZbir 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 grepyapmayı 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 xargskullanarak 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.


-1

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


Sorunun "dosyanın içinde arama yapma" bölümüne hiç değinmediği için bu yalnızca kısmi bir cevaptır. Ayrıca, finddiğer yanıtların bazılarında gösterildiği gibi , dosya adı globbing desenlerini kullanmak da çok daha etkilidir .
Kusalananda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.