Відповіді:
Якщо я правильно вас зрозумів, це ви хочете зробити:
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
виявляє виникнення. Однак, якщо ви заміните на ;
a +
, grep
виклик виводиться з find
об'єднаного (до певної межі). Дивіться питання Використання крапки з комою (;) проти плюс (+) з exec, щоб знайти більше по темі.
grep -H
якщо ви хочете включити ім'я файлу у висновок.
Якщо ви хочете зберегти всі відповідні рядки в усіх файлах у 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 -n "something"
Використання 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
буде виглядати як один довгі безперервні лінії тексту.
Як ви будете мати справу (чи ні) з цим, залежить від вас.
+
замість\;
цього значно покращить час виконання (оскільки він буде контактувати з аргументами до виконання до цього часуARG_MAX
).