grep - eşleşmenin bulunduğu dosya adını listeler


31

Bir dizinde bir sürü .html dosyası var. Her dosyaya bakmak ve bir model (MD5) eşleştirmek istiyorum. Bunların hepsi yeterince kolaydır. Sorun şu ki, eşleşmenin hangi dosyada bulunduğunu bilmem gerekiyor.

cat *.html | grep 75447A831E943724DD2DE9959E72EE31

Yalnızca eşleşmenin bulunduğu HTML sayfası içeriğini döndürür, ancak bana içinde bulunduğu dosyayı söylemez. Eşleşmenin bulunduğu dosyanın adını bana göstermek için nasıl grep alabilirim?


Sağlanan öneri gerçekten işe yaramaz .... Tek aldığım 'standart giriş' cat * .html | grep -i -H 1ee024007823cc0bfbefba98ba1e1f4c (standart girdi): <html> <head> <title>
BeMy Arkadaş

4
noktayı kaçırıyorsun. Kedi kullanmana gerek yok. Kedi, grep'in ayrı ayrı dosyaları ayırt etmesini önler.
muru

Bu Yığın Taşması postasını faydalı bulabilirsiniz .
Pablo A,

Yanıtlar:


32
grep -H 75447A831E943724DD2DE9959E72EE31 *.html

-H, --with-filename
              Print the file name for each match. This is
              the default when there is more than one file
              to search.

3
Söylediği gibi, birden fazla dosya için varsayılan, birden fazla html dosyası olduğu sürece -Hgerekli değildir.
muru

1
Üzgünüm sorum rahatsız edici oldu. Bir süredir bunun üzerinde çalıştığımı ve çok sayıda anahtar kullandığımı ve dosya adını varsayılan olarak listelediğini söyleyen MAN sayfasını okudum demeliydim ... Ama ne elde ederim (standart girdi () burada dosya ismini listelemelidir.
Arkadaş Arkadaş

ve sadece -H anahtarını verirsem. Yalnızca OP'de listelediklerimi yaparsam, herhangi bir dosya adı sağlamaz.
Arkadaş Arkadaş

3
@BeMyFriend, sorun şu ki cat. catbirleştirmek demektir. Tüm dosyaları iletmeden önce bir araya getirdiyseniz grep, grepyalnızca bir büyük standart girdi dosyasına bakın ve tek bir dosya hakkında herhangi bir bilgi veremezsiniz. Görmek?. Cyrus, cevabında bunu açıklamaya ne dersin?
Rmano

Tamam, sorun cat komutudur, ancak çözüm ne olabilir?
Josef Klimuk

20

Bir dizinde RECURSIVELY bir dize içeren dosyaları aramak için bunu her zaman kullanıyorum (bu, herhangi bir alt sub alt klasörü geçiyor demektir) grep -Ril "yoursearchtermhere"

  • R özyinelemeli arama yapmaktır (aşağıdaki linkleri takip edin)
  • i büyük / küçük harf duyarsız hale getirmektir
  • l sadece dosyaların adını listelemek içindir.

bu nedenle sorunuzu yanıtlamak yeterli grep -l '75447A831E943724DD2DE9959E72EE31' *.htmlolacaktır ancak grep -Ril '75447A831E943724DD2DE9959E72EE31'herhangi bir alt klasördeki herhangi bir dosyada, büyük / küçük harfe duyarlı olmayan o dizgiyi aramak için sadece yapabilirsiniz


macOS her zaman bir dosya def gerektirir, bir joker olabilir. Aksi takdirde, stdin( grep: warning: özyinelemeli stdin araması , ne kadar özyineleli stdin girdisi :-) anlamına gelirse) girişini varsayar . Başka bir deyişle:grep -Ril 'texttofind' *
Ville,

grep -RiH 'pattern'dosya adını ve eşleşen satırı gösterir
Ikrom


2
grep -r -H 75447A831E943724DD2DE9959E72EE31 *.html | awk -F : ' { print $1 } '

Alternatif

grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html

Yukarıdakileri yapmak, klasör ve alt klasörlerde özyinelemeli olarak arama yapar ve dosyanın yolunu yazdırır ...


grep -r -l bana çalışan tek şey.
Josef Klimuk

0

Cyrus tarafından gönderildi cevabı kesinlikle doğru olduğunu ve Sağ yoldur TM ile yapmak grepbiz eğer sadece dosyaları bulmak gerekir . Dosya adlarının eşleşen dosya adlarında ek ayrıştırma veya işlemler yapılması gerektiğinde, ifadeyi whileiçeren döngüyü kullanmaya başvurabiliriz if. İşte dosya adlarının listesi, dosya adlarının güvenli şekilde ayrıştırılması için çok kullanılan find+ whileyapıdan geldiği bir örnektir .

find -type f -name "*.html" -print0 | while IFS= read -r -d '' filename
do
    if grep -q 'PATTERN' "$filename"
    then
        printf "%s found in %s\n" 'PATTERN' "$filename"
        # Here we can insert another command or function
        # to perform other operations on the filename
    fi
done

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.