Как я могу использовать grep для отображения только имен файлов (без встроенных совпадений) в Linux?

как я могу использовать grep показывать только имена файлов (без совпадений в строке) в Linux?

Я обычно использую что-то вроде:

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

как я могу просто получить имена файлов (с путями), но без совпадений? Должен ли я использовать xargs? Я не видел способа сделать это на моем grep man-страница.

3 ответов


стандартный вариант grep -l (это нижний регистр L) может сделать это.

С стандартные 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.

Вам также не нужно -H в этом случае.


С grep(1) man page:

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

для простого поиска файла можно использовать команду grep в -l и -r варианты:

grep -rl "mystring"

весь поиск выполняется grep. Конечно, если вам нужно выбрать файлы по какому-то другому параметру, найдите правильное решение:

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

на execdir опция создает каждую команду grep для каждого каталога и объединяет имена файлов только в одну команду (+).