Як переглядати рядок рекурсивно через усі .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хака.