5

Я могу выполнить поиск по ряду файлов для конкретной строки, используя конвейерные команды 'grep' и 'find'.

Теперь у меня есть около 10 zip-файлов, в каждом из которых находится много текстовых файлов. Можно ли найти строку во всех текстовых файлах, заархивированных во всех этих zip-файлах, не извлекая zip-файлы?

3 ответа3

2

Вы также можете использовать команду zipgrep, которая входит в пакет unzip. Например:

for z in *.zip ; do zipgrep PATTERN $z |sed "s/^/$z: /" ; done

Эта команда также дает вам совпадающие имена файлов внутри архивов.

1

Смонтируйте архивы как каталоги, используя AVFS или fuse-zip. Оба являются файловыми системами FUSE.

AVFS обеспечивает представление файловой системы в ~/.avfs где каждый архивный файл имеет связанный каталог с тем же именем и символом # в конце.

mountavfs
grep -r PATTERN ~/.avfs/$PWD/*.zip\#/
…
unmountavfs

Fuse-zip монтирует zip в каталог.

for z in *.zip; do mkdir "$z.d" && fuse-zip "$z" "$z.d"; done
grep -r PATTERN *.zip.z/
…
fusermount -u *.zip.d
rmdir *.zip.d
1
unzip -c \*.zip | grep yourtext

Вы можете использовать некоторые регулярные выражения в команде grep для тонкой настройки соответствия строк

Основываясь на комментариях ниже, zgrep будет лучшим вариантом.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .