как найти файлы, содержащие строку с помощью egrep

Соответствовать скопированному слою к размеру холста:

  1. Щелчок правой кнопкой по слою "Выбора уровня
  2. к Размеру изображения"

Это будет масштабировать слой к размеру изображения

5
задан Tolga 1 September 2009 в 13:52
поделиться

7 ответов

Здесь вы отправляете имена файлов (вывод команды find ) в качестве входных данных для egrep; вы действительно хотите запустить egrep для содержимого файлов.

Вот несколько альтернатив:

find . -name "*.txt" -exec egrep mystring {} \;

или даже лучше

find . -name "*.txt" -print0 | xargs -0 egrep mystring

Проверьте справку команды find , чтобы проверить, что делают отдельные аргументы .
Первый подход порождает новый процесс для каждого файла, в то время как второй передаст более одного файла в качестве аргумента egrep; флаги -print0 и -0 необходимы для работы с потенциально опасными именами файлов (позволяющими правильно разделять имена файлов, например, даже если имя файла содержит пробел).

12
ответ дан 12 December 2019 в 21:13
поделиться

попробуйте:

find . -name '*.txt' | xargs egrep mystring

В вашей версии есть две проблемы:

Во-первых, , *. Txt сначала будет расширен оболочкой, что даст вам список файлов в текущем каталоге, которые заканчиваются на .txt , например, если у вас есть следующее:

[dsm@localhost:~]$ ls *.txt
test.txt
[dsm@localhost:~]$ 

ваша команда find превратится в find. -name test.txt . Просто попробуйте следующее, чтобы проиллюстрировать:

[dsm@localhost:~]$ echo find . -name *.txt
find . -name test.txt
[dsm@localhost:~]$ 

Во-вторых, , egrep не берет имена файлов из STDIN . Чтобы преобразовать их в аргументы, вам нужно использовать xargs

2
ответ дан 12 December 2019 в 21:13
поделиться

Вы можете использовать

find . -iname *.txt -exec egrep mystring \{\} \;
1
ответ дан 12 December 2019 в 21:13
поделиться
find . -name *.txt | egrep mystring

Это не сработает, поскольку egrep будет искать mystring в выводе, сгенерированном find. -name * .txt - это просто путь к файлам *. txt .

Вместо этого вы можете использовать xargs :

find . -name *.txt | xargs egrep mystring
1
ответ дан 12 December 2019 в 21:13
поделиться

Вот пример, который возвращает пути к файлам для всех файлов *. Log , строка которых начинается с ERROR :

find . -name "*.log" -exec egrep -l '^ERROR' {} \;
1
ответ дан 12 December 2019 в 21:13
поделиться

в egrep есть рекурсивная опция, которую вы можете использовать

egrep -R "pattern" *.log
1
ответ дан 12 December 2019 в 21:13
поделиться

Если вам нужны только имена файлов:

find . -type f -name '*.txt' -exec egrep -l pattern {} \;

Если вам нужны имена файлов и совпадения:

find . -type f -name '*.txt' -exec egrep pattern {} /dev/null \;
1
ответ дан 12 December 2019 в 21:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: