Як я можу використовувати grep, щоб показувати лише файли файлів у Linux?


1067

Як я можу 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' / шлях / до / файл /
iamjayp

Відповіді:


1624

Стандартний варіант 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цьому випадку вам також не потрібно .


37
Документація цього варіанту (як часто в більшості файлів man) настільки незрозуміла! Pfff ... Дивовижно, як людині може бути біль в попці.
Месьє

1
-H також показує самі матчі. Питання було лише для іменних файлів.
Хоук

@Hauke ​​І моя відповідь була -l. Я згадав -H лише тому, що команда користувача у запитання включила -H і це зайве, коли задано -l.
Випадково832

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-Abrams Рівно. При першому враженні документа ви відчуваєте, що він буде надрукувати лише ім'я першого файлу. Вам дійсно потрібно пару прочитань, щоб зрозуміти це.
TheMonkWhoSoldHisCode

5
"Сканування поточного файлу припиниться при першій відповідності." було б набагато зрозуміліше.
sorrymissjackson

37

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

grep -rl "mystring"

Весь пошук проводиться grep. Звичайно, якщо вам потрібно вибрати файли за іншим параметром, знайдіть правильне рішення:

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

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


0

Ваше запитання Як я можу просто отримати імена файлів (із шляхами)

Знайдіть ваш приклад синтаксису . -iname "* php" -exec grep -H myString {} \;

Моя командна пропозиція

sudo find /home -name *.php

Вихід з цієї команди на моїй ОС Linux:

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

Як вам потрібно ім'я файлу з контуром, насолоджуйтесь!


Питання конкретно запитує, як вони отримують імена файлів за допомогою grep .
snakecharmerb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.