Пошук файлів, які містять певний рядок, використовуючи find (1) та grep (1)


70

find . -type f -print -exec cat {} \; | grep some string

Команда вище не друкує шлях до файлу.

Я використовую: Ubuntu, bash 4.


Можливо, це не відповідає вашим очікуваним результатам через фільтр grep. Що з цього приводу:find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
artistoex

Яку мету ви хочете досягти? На виході ви отримуєте схоплені рядки з файлів, ви хочете шлях до цих файлів?
mirkobrankovic

Так, я хочу надрукувати шлях до файлів, що містять рядок 'деякий рядок'. @artistoex пропозиція друкує всі шляхи до файлу.
H.Rabiee

Ви можете просто скористатися ackдля перегляду всіх файлів у поточному каталозі, можливо, фільтруючи лише певні типи файлів.
Яап Старійшина

Відповіді:


87

Це тому, що ви подаєте grepпотік тексту, який просто містить файли файлів. Оскільки ви не вказали назви файлів в якості аргументів для отримання grep, не можна очікувати, звідки вийде файл, з якого походить відповідна лінія. Використання xargs:

find . -type f -print | xargs grep "some string"

Оскільки у вас є GNU find / xargs, це більш безпечний спосіб для читання файлів xargs:

find . -type f -print0 | xargs -0 grep "some string"

Якщо ви хочете лише назви файлів, які мають відповідні рядки, не показуючи відповідні рядки:

find . -type f -print0 | xargs -0 grep -l "some string"

Як би я поєднав вищезазначені команди із пошуком та заміною? Як в, греп тоді sed?
CMCDragonkai

1
знахідка | grep pipeline виводить імена файлів, так:sed '...' $(find ... | xargs grep -l ...)
Глен Джекман

107

я використовую

grep "some string" . -R

і це працює швидше

пс

Більш складний випадок використання

grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex 

Читати парам i пояснення

grep --help | grep -- -i

17
І -nякщо ви хочете номери рядків. +1 для спрощеної відповіді.
Chad Skeeters

@ChadSkeeters точно. Використання знахідки не дає такого рішення.
ArcherGodson

1
Якщо чесно, це слід позначити як правильну відповідь. На даний момент вибраний один деталізує щось інше цілком.

12

Я часто шукаю вихідний код у складних структурах папок і вважаю корисним за допомогою:

cd /your/folder/
grep -rHino "your string"

За допомогою цих параметрів, не використовуючи find , я отримую повний шлях до файлу та номер рядка, що містить вказаний рядок .

Це також легко запам’ятати, тому що БАШ проходить через ваш пошук, як носоріг :)

Я покажу, як це працює на швидкому прикладі.

Давайте покажемо вміст файлу за допомогою cat:

jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

І давайте рекурсивно шукати всі файли, що містять рядок "iptables -P":

jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P

Як ви бачите у висновку, у нас є ім'я файлу: рядок хітів: рядок пошуку

Ось більш детальний опис використовуваних параметрів:

-r Для кожного операнду каталогів читайте та обробляйте всі файли в цьому каталозі рекурсивно. Дотримуйтесь символьних посилань у командному рядку, але пропускайте символьні посилання, які зустрічаються рекурсивно. Зауважте, що якщо не вказаний операнд файлів, grep здійснює пошук у робочому каталозі. Це те саме, що опція '--directories = recurse'.

-i Вивести назву файлу для кожної відповідності. Це за замовчуванням, коли для пошуку більше одного файлу.

-n Префікс кожного рядка виводу з номером рядка на основі 1 у вхідному файлі. (-n визначається POSIX.)

-H Роздрукуйте ім’я файлу для кожного матчу. Це за замовчуванням, коли для пошуку більше одного файлу.

-o Друкуйте лише відповідні (не порожні) частини відповідних рядків, причому кожна така частина буде окремим рядком виводу. Вихідні рядки використовують ті ж роздільники, що і вхідні, а роздільники - це нульові байти, якщо також використовується -z (--null-data) (див. Інші параметри).


1

Я віддав перевагу

| знайти файл | make grep ont файл пошуку | показати повний шлях до файлу

find / -type f -exec grep 'деякий рядок' {} \; -exec echo {} \;


0

Silver Searcher - це дуже швидкий та зручний інструмент для пошуку файлів та вмісту.

Щоб вирішити вашу проблему, команда пошуку срібла виглядала б так ...

ag 'some string' -l

-l Друкувати лише назви файлів, які містять відповідність (не друкуйте відповідні рядки)

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