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

1069

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

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

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

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

УХО
источник
3
Ты имеешь в виду, ты хочешь имена файлов, которые имеют хотя бы одно совпадение?
leonbloy
4
Отличный вопрос Я фактически начал использовать это, чтобы открыть список файлов, возвращаемых grep в Vim. vim $(grep -rl Something app/)
Дэвид Туит
1
Вы не можете перечислить файлы с помощью команды grep, она в основном используется для извлечения нужного текста из файла или списка. Например, ps aux | grep 'apt-get' или grep 'text-to-find' / path / to / file /
iamjayp

Ответы:

1626

Стандартная опция 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в этом случае.

Random832
источник
37
Документация по этой опции (как это часто бывает в большинстве файлов man) настолько неясна! Пффф ... Удивительно, как у мужчины может быть боль в заднице.
MonsieurDart
1
-Н также показывает сами спички. Вопрос был только для имен файлов.
Хауке
@ Хауке И мой ответ был -l. Я упомянул -H только потому, что команда пользователя в вопросе включала -H, и это избыточно, когда дается -l.
Random832
2
Хорошо, мне лично нравится использовать это с другими флагами grep -nrl "some text" .при рекурсивном поиске текста в наборе подпапок
openwonk
142

Со 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.)
Игнасио Васкес-Абрамс
источник
4
Остановка на первом матче необходима и природе.
Томсон
7
документация делает это немного неясным. «Сканирование остановится при первом совпадении» - означает, что будут напечатаны все имена файлов, но сканирование по совпадающему слову будет остановлено при первом совпадении.
TheMonkWhoSoldHisCode
2
@VishalP: Поскольку нам все равно, где находятся вхождения, а только то, что они существуют, нет смысла искать каждый файл, кроме первого вхождения.
Игнасио Васкес-Абрамс
17
@ IgnacioVazquez-Абрамс Точно. Первое впечатление от документа заставляет вас чувствовать, что он будет печатать только имя файла первого файла. Вам действительно нужно пару чтений, чтобы понять это.
TheMonkWhoSoldHisCode
5
«Сканирование текущего файла остановится при первом совпадении». было бы намного понятнее.
Извините, Джексон
37

Для простого поиска файлов вы можете использовать grep's -lи -rпараметры:

grep -rl "mystring"

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

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

execdirВариант сборка каждой команды Grep за каждый каталог, и присоединяет имена файлов в только одна команду (+ ).

жестяной человек
источник
0

Ваш вопрос Как я могу просто получить имена файлов (с путями)

Ваш пример синтаксиса найти. -имя "* php" -exec grep -H myString {} \;

Моя команда предложение

sudo find /home -name *.php

Вывод этой команды на моей ОС Linux:

Compose-образец-3 / HTML / почты / contact_me.php

Поскольку вам требуется имя файла с путем, наслаждайтесь!

APL
источник
Вопрос конкретно спрашивает, как они получают имена файлов, используя grep .
snakecharmerb