Если я вас правильно понимаю, это то, что вы хотите сделать:
find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt
Find
все файлы с расширением py
, grep
только строки, содержащие something
и сохраняющие строки в output.txt
. Если файл содержит что-либо, он будет заменен.
Редактировать: Используя -exec:
find . -name '*.py' -exec grep 'something' {} \; > output.txt
Я включил комментарий Криса Даунса здесь. Приведенная выше команда будет grep
выполняться столько раз, сколько будет find
найдено. Тем не менее, если вы замените ;
с +
, grep
вызываются с выходом из find
конкатенации (до определенного предела). Смотрите вопрос Использование точки с запятой (;) против плюс (+) с exec в find для получения дополнительной информации по этому вопросу.
+
вместо\;
, это значительно улучшит время выполнения (поскольку оно будет содержать аргументы до выполнения и доARG_MAX
).grep -H
если вы хотите включить имя файла в вывод.Если вы хотите сохранить все совпадающие строки во всех файлах
output.txt
, ваша последняя команда работает, за исключением того, что вы пропустили обязательное;
в конце команды.Если вы хотите, чтобы при каждом запуске
grep
выводился отдельный файл, запустите оболочку, чтобы вычислить имя выходного файла и выполнить перенаправление.источник
find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt
И если вы хотите увидеть номера строк grep'-строк, вы можете, конечно, использоватьgrep -n "something"
Для записи,
grep
имеет--include
и--exclude
аргументы, которые вы можете использовать для фильтрации файлов, которые она ищет:источник
grep
делает.Используйте
tee
:Протест, если у вас есть какие - либо файлы с помощью специальных символов (включая пробелы) , что
xargs
иgrep
не будет хорошо работать (a file.txt
будет интерпретироваться как два файла,a
аfile.txt
). Альтернативой этому является использование либо,-x
либо-print0
, но любой из них будет загрязнять вашoutput.txt
.-x
Будет использовать ,\
чтобы избежать некоторых специальных символов , и это будетoutput.txt
. В-print0
качестве разделителя полей будет использоваться нулевой байт (который также требуетсяxargs -0
) иoutput.txt
будет выглядеть как одна длинная непрерывная строка текста.Как вы справляетесь (или не имеете) с этим, зависит только от вас.
источник