Як переглядати рядок рекурсивно через усі .gz
файли у всіх каталогах і підкаталогах?
Як переглядати рядок рекурсивно через усі .gz
файли у всіх каталогах і підкаталогах?
Відповіді:
@Steve Weet майже є. Використання / dev / null в якості додаткового аргументу є хорошим способом змусити показ імені файлу (я пам’ятаю, що, дякую Стіву), але він все ще запускає exec для кожного знайденого файлу - величезна накладні витрати.
Ви хочете запустити zgrep якомога менше разів, отримуючи максимум користі від кожного виконання:
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargs
надасть якомога більше аргументів (іменних файлів) для згрепу та повторно виконуватиме його, поки він не використає всі файли, надані find
командою. Використання -print0
і -0
параметрів дозволяє йому працювати, якщо в будь-якому з назв файлів чи каталогів є пробіли.
На Mac OS X ви можете досягти такого ж ефекту без xargs:
find . -iname '*.gz' -exec zgrep PATTERN {} +
-H
щоб завжди показувати ім'я файлу відповідним рядком, принаймні в GNU grep.
$ zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.
Так щось на кшталт
find . -iname "*.gz" -exec zgrep PATTERN {} \
zgrep -r
для переходу через дерево, або якщо -r не працює, xargs zgrep
/bin/zgrep: -r: option not supported
на свою недавно встановлену систему ubuntu.
xargs
замість цього тоді.
@aioobe майже є. Команда виконає цю роботу, але не повідомить вам ім'я файлу
Нижче слід вказати і ім’я файлу:
find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;
Додавання /dev/null
буде гарантувати, що zgrep бачить дві імена файлів, тому він покаже вам ім'я файлу, якщо він знайде рядок
EDIT
Подальше дослідження показує, що для моєї машини (OS / X) -exec
аргумент для пошуку додасть якомога більше імен файлів (аналогічно тому, як xargs
поводиться).
-exec
- я все про портативність, тому я б не використовував його в сценарії, але відмінно підходить для командного рядка.
find
, але більшості сучасних (наприклад, у дистрибутивах на основі Debian).
-H
щоб завжди показувати ім'я файлу з відповідним рядком, принаймні, у GNU grep замість /dev/null
хака.