Jak mogę użyć grep, aby wyświetlać tylko nazwy plików w systemie Linux?

1067

Jak mogę użyć, grepaby wyświetlać tylko nazwy plików (bez dopasowań w linii) w systemie Linux?

Zwykle używam czegoś takiego:

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

Jak mogę uzyskać nazwy plików (ze ścieżkami), ale bez dopasowań? Czy muszę używać xargs? Nie widziałem sposobu, aby to zrobić na mojej grepstronie podręcznika.

cwd
źródło
3
Chcesz powiedzieć, że nazwy plików mają co najmniej jedno dopasowanie?
leonbloy
4
Świetne pytanie. Zacząłem używać tego do otwierania listy plików zwracanych przez grep w Vimie. vim $(grep -rl Something app/)
David Tuite
1
Nie można wyświetlać plików za pomocą polecenia grep, jest ono zasadniczo używane do pobierania żądanego tekstu z pliku lub listy. Na przykład ps aux | grep 'apt-get' lub grep 'text-to-find' / path / to / file /
iamjayp

Odpowiedzi:

1624

grep -lMoże to zrobić standardowa opcja (czyli mała litera L).

Ze standardu Unix :

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

W -Htym przypadku nie potrzebujesz również .

Losowo 832
źródło
37
Dokumentacja tej opcji jest (jak często w większości plików man) tak niejasna! Pfff… Niesamowite, jak człowiek może być bólem w tyłek.
MonsieurDart
1
-H pokazuje także same mecze. Pytanie dotyczyło tylko nazw plików.
Hauke
@Hauke ​​I moja odpowiedź brzmiała -l. Wspomniałem -H tylko dlatego, że polecenie użytkownika w pytaniu zawierało -H i jest zbędne, gdy podano -l.
Random832
2
Fajnie, osobiście lubię używać tego z innymi flagami, grep -nrl "some text" .gdy rekursywnie szukam tekstu w zestawie podfolderów
openwonk
142

Ze strony podręcznika grep(1):

  -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.)
Ignacio Vazquez-Abrams
źródło
4
Zatrzymanie się przy pierwszym meczu jest konieczne i natura.
Thomson,
7
dokumentacja sprawia, że ​​jest to trochę niejasne. „Skanowanie zatrzyma się przy pierwszym dopasowaniu” - oznacza, że ​​wszystkie nazwy plików zostaną wydrukowane, ale skanowanie pasującego słowa zatrzyma się przy pierwszym wystąpieniu.
TheMonkWhoSoldHisCode
2
@ VishalP: Ponieważ nie obchodzi nas, gdzie są wystąpienia, tylko że one istnieją, nie ma sensu przeszukiwać każdego pliku poza pierwszym wystąpieniem.
Ignacio Vazquez-Abrams
17
@ IgnacioVazquez-Abrams Dokładnie. Pierwsze wrażenie dokumentu sprawia, że ​​czujesz, że wydrukuje on tylko nazwę pierwszego pliku. Naprawdę potrzebujesz kilku odczytów, aby to zrozumieć.
TheMonkWhoSoldHisCode
5
„Skanowanie bieżącego pliku zatrzyma się przy pierwszym dopasowaniu”. byłoby znacznie jaśniejsze.
sorrymissjackson
37

Do prostego wyszukiwania plików możesz użyć grep's -li -ropcji:

grep -rl "mystring"

Całe wyszukiwanie odbywa się przez grep. Oczywiście, jeśli musisz wybrać pliki z innym parametrem, znajdź właściwe rozwiązanie:

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

execdirOpcja buduje każde polecenie grep za każdym katalogu, a Łączy nazewnictwo się tylko jedno polecenie ( +).

Blaszany Człowiek
źródło
0

Twoje pytanie Jak mogę uzyskać nazwy plików (ze ścieżkami)

Twój przykład składni znajdź. -iname "* php" -exec grep -H myString {} \;

Moja sugestia polecenia

sudo find /home -name *.php

Dane wyjściowe tego polecenia w moim systemie operacyjnym Linux:

compose-sample-3 / html / mail / contact_me.php

Ponieważ potrzebujesz nazwy pliku ze ścieżką, ciesz się!

apl
źródło
Pytanie dotyczy w szczególności sposobu, w jaki uzyskują nazwy plików za pomocą grep .
snakecharmerb