find . -type f -print -exec cat {} \; | grep some string
Команда вище не друкує шлях до файлу.
Я використовую: Ubuntu, bash 4
.
ack
для перегляду всіх файлів у поточному каталозі, можливо, фільтруючи лише певні типи файлів.
find . -type f -print -exec cat {} \; | grep some string
Команда вище не друкує шлях до файлу.
Я використовую: Ubuntu, bash 4
.
ack
для перегляду всіх файлів у поточному каталозі, можливо, фільтруючи лише певні типи файлів.
Відповіді:
Це тому, що ви подаєте 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 '...' $(find ... | xargs grep -l ...)
я використовую
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
-n
якщо ви хочете номери рядків. +1 для спрощеної відповіді.
Я часто шукаю вихідний код у складних структурах папок і вважаю корисним за допомогою:
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) (див. Інші параметри).
Я віддав перевагу
| знайти файл | make grep ont файл пошуку | показати повний шлях до файлу
find / -type f -exec grep 'деякий рядок' {} \; -exec echo {} \;
Silver Searcher - це дуже швидкий та зручний інструмент для пошуку файлів та вмісту.
Щоб вирішити вашу проблему, команда пошуку срібла виглядала б так ...
ag 'some string' -l
-l
Друкувати лише назви файлів, які містять відповідність (не друкуйте відповідні рядки)
find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string