Linux'ta sadece dosya adlarını göstermek için grep'i nasıl kullanabilirim?


1068

grepLinux'ta yalnızca dosya adlarını (satır içi eşleşmeler olmadan) göstermek için nasıl kullanabilirim ?

Genellikle böyle bir şey kullanıyorum:

find . -iname "*php" -exec grep -H myString {} \;

Dosya adlarını (yollarla), ancak eşleşmeleri olmadan nasıl alabilirim? Kullanmam gerekiyor xargsmu? Bunu grepadam sayfamda yapmanın bir yolunu görmedim .


3
Yani, en az bir eşleşmesi olan dosya adlarını mı istiyorsunuz?
leonbloy

4
Harika bir soru. Aslında Vim'de grep tarafından döndürülen dosyaların bir listesini açmak için bunu kullanmaya başladım. vim $(grep -rl Something app/)
David Tuite

1
Grep komutunu kullanarak dosyaları listeleyemezsiniz, temel olarak bir dosyadan veya listeden istenen metni almak için kullanılır. Örneğin, ps aux | grep 'apt-get' veya grep 'bulmak için metin' / path / to / file /
iamjayp

Yanıtlar:


1625

Standart seçenek grep -l(küçük L harfidir) bunu yapabilir.

Gönderen Unix standardı :

-l
    (The letter ell.) Write only the names of files containing selected
    lines to standard output. Pathnames are written once per file searched.
    If the standard input is searched, a pathname of (standard input) will
    be written, in the POSIX locale. In other locales, standard input may be
    replaced by something more appropriate in those locales.

-HBu durumda da ihtiyacınız yoktur .


37
Bu seçeneğin dokümantasyonu (çoğu insan dosyasında olduğu gibi) çok belirsizdir! Pfff… İnsanın kıçından nasıl acı çekebileceği şaşırtıcı.
MonsieurDart

1
-H maçları da gösterir. Soru sadece dosya adları içindi.
Hauke

@Hauke ​​Ve cevabım -l. -H'den bahsettim çünkü sorudaki kullanıcının komutu -H'yi içeriyor ve -l verildiğinde gereksiz.
Random832

2
Güzel, kişisel olarak bunu grep -nrl "some text" .bir dizi alt klasörde tekrar tekrar metin ararken diğer bayraklarla kullanmayı seviyorum
openwonk

142

Gönderen grep(1)adam sayfası:

  -l, --files-with-matches
          Suppress  normal  output;  instead  print the name of each input
          file from which output would normally have  been  printed.   The
          scanning  will  stop  on  the  first match.  (-l is specified by
          POSIX.)

4
İlk maçta durmak gerekli ve doğa.
Thomson

7
dokümantasyon bunu biraz belirsizleştiriyor. "Tarama ilk eşleşmede duracaktır" - tüm dosya adlarının yazdırılacağını gösterir, ancak eşleşen sözcüğün taranması ilk sırada duracaktır.
TheMonkWhoSoldHisCode

2
@VishalP: Olayların nerede olduklarını umursamadığımız için, sadece var olduklarından, her bir olayı ilk olaydan sonra aramanın anlamı yoktur.
Ignacio Vazquez-Abrams

17
@ IgnacioVazquez-Abrams Kesinlikle. Belgenin ilk izlenimi, belgenin yalnızca ilk dosyanın dosya adını yazdıracağını hissetmenizi sağlar. Anlamak için gerçekten birkaç okumaya ihtiyacınız var.
TheMonkWhoSoldHisCode

5
'Geçerli dosyanın taranması ilk maçta duracaktır.' çok daha net olurdu.
sorrymissjackson

37

Basit bir dosya araması için grep -lve -rseçeneklerini kullanabilirsiniz:

grep -rl "mystring"

Tüm arama grep tarafından yapılır. Tabii ki, başka bir parametredeki dosyaları seçmeniz gerekiyorsa, bulmak doğru çözümdür:

find . -iname "*.php" -execdir grep -l "mystring" {} +

Bu execdirseçenek, her bir dizin için her grep komutunu oluşturur ve dosya adlarını yalnızca bir komutla ( +) birleştirir.


0

Sorunuz Dosya adlarını nasıl alabilirim (yollarla)

Sözdizimi örnek bulunuz. -iname "* php" -exec grep -H myString {} \;

Komut önerim

sudo find /home -name *.php

Linux işletim sistemimde bu komutun çıktısı:

oluşturma-numune-3 / html / posta / contact_me.php

Dosya adı yolu ile istediğiniz gibi, tadını çıkarın!


Soru, özellikle grep kullanarak dosya adlarını nasıl aldıklarını soruyor .
snakecharmerb
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.