Randal Schwartz раньше часто отправлял "Бесполезное использование (x)" в списках. Одно такое сообщение было о kill -9
. Это включает причины и рецепт для следования. Вот восстановленная версия (заключена в кавычки ниже).
(Отвращение кавычки)
Нет нет нет. Не используйте уничтожают-9.
Это не дает процессу шанс чисто:
1) закройте сокетные соединения
2) очистите временные файлы
3) сообщите его детям, что это уходит
4) сбросьте его терминальные характеристики
и так далее и так далее и так далее.
Обычно отправьте 15 и ожидайте секунда или два, и если это не работает, отправьте 2, и если это не работает, отправьте 1. Если это не делает, УДАЛЯЕТ ДВОИЧНЫЙ ФАЙЛ, потому что программа плохо себя ведется!
Не используйте уничтожают-9. Не производите комбайн только для уборки цветочного горшка.
Просто другое Бесполезное Использование Usenet,
(.signature)
Если я понимаю Вас правильно, это - то, что Вы хотите сделать:
find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt
Find
все файлы с расширением py
, grep
только строки, которые содержат something
и сохраните строки в output.txt
. Если файл содержит что-нибудь, что он будет заменен.
Править: Использование - должностное лицо:
find . -name '*.py' -exec grep 'something' {} \; > output.txt
Я включаю комментарий Chris Downs здесь. Вышеупомянутая команда приведет к grep
будучи выполняемым так же много раз как find
находит происшествия. Однако, если Вы заменяете ;
с a +
, grep
назван с выводом от find
связанный (до определенного предела). Посмотрите вопрос Использовать точку с запятой (;) по сравнению с плюс (+) с должностным лицом в находке для больше на предмете.
Если Вы хотите сохранить все согласующие отрезки длинной линии через все файлы в output.txt
, Ваша последняя команда действительно работает, за исключением того, что Вы пропускаете необходимое ;
в конце команды.
find . -name "*.py" -type f -exec grep "something" {} \; > output.txt
Если Вы хотите каждое выполнение grep
для создания вывода для другого файла выполните оболочку, чтобы вычислить имя выходного файла и выполнить перенаправление.
find . -name "*.py" -type f -exec sh -c 'grep "something" <"$0" >"$0.txt"' {} \;
find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt
И если требуется видеть номера строки grep'ed строк, можно, конечно, использовать grep -n "something"
– JJMpls
24.07.2014, 05:27
Использовать tee
:
find . -name '*.py' | tee output.txt | xargs grep 'something'
Протест, то, если у Вас есть какие-либо файлы со специальными символами (включая пробелы) это xargs
и grep
не будет работать хорошо с (a file.txt
будет интерпретироваться как два файла, a
и file.txt
). Альтернатива этому должна использовать любого -x
или -print0
, но любой из тех загрязнит Ваш output.txt
. -x
будет использовать \
для выхода из определенных специальных символов и это будет в output.txt
. -print0
будет использовать пустой байт в качестве разделителя полей (который также требует xargs -0
) и output.txt
будет похож на одну длинную непрерывную строку текста.
Как Вы имеете дело (или делаете не) с Вам решать.
Для справки, grep
имеет аргументы --include
и --exclude
, которые можно использовать для фильтрации искомых файлов:
grep -r --include="*.py" "something" > output.txt
Чтобы найти файлы в каталоге и найти строку в результате :find $dir -name "*partoffilename*" | xargs -I '{}' grep -ri $searchstring {}
+
вместо\;
, это значительно улучшит время выполнения (так как это будет contatenate аргументы до выполнения доARG_MAX
). – Chris Down 06.11.2011, 16:31grep -H
если Вы хотите включать имя файла файла в выводе. – Steinar 23.04.2018, 16:18