it-swarm-ru.tech

Поиск строки в нескольких файлах Zip

Я работаю над SunOS 5.10. У меня есть папка, которая содержит около 200 файлов Zip. Каждый Zip-файл содержит только один текстовый файл. Я хотел бы найти конкретную строку во всех текстовых файлах во всех файлах Zip.

Я попытался это (который ищет любой текстовый файл в файле Zip, который содержит строку "ORA-"), но это не сработало.

zipgrep ORA-1680 *.Zip

Как правильно делать это, не распаковывая файлы Zip?

25
ziggy

Как правило, поиск содержимого в сжатом файле невозможен без его разархивирования. Так как zipgrep - это всего лишь оболочка, которая включает в себя разархивирование и сам egrep, вы можете сделать это вручную:

for file in *.Zip; do unzip -c "$file" | grep "ORA-1680"; done

Если вам нужен только список подходящих Zip-файлов, вы можете использовать что-то вроде:

for file in *.Zip; do
    if ( unzip -c "$file" | grep -q "ORA-1680"); then
        echo "$file"
    fi
done

Таким образом, вы распаковываете только в стандартный вывод (т.е. в память), а не распаковываете файлы на диск. Конечно, вы можете попробовать просто grep -a Zip-файлы, но в зависимости от содержимого файла и вашего шаблона вы можете получить ложные срабатывания и/или ложные отрицания.

27
Noah

zipgrep занимает один файл. Чтобы заставить его работать с несколькими файлами, поместите его в цикл:

for i in *.Zip
do
   zipgrep ORA-1680 "$i"
done
18
dogbane

Файловая система AVFS представляет представление файловой системы, в которой каждый архивный файл /path/to/foo.Zip доступен как каталог ~/.avfs/path/to/foo.Zip#. Это Fuse файловая система, которую вы можете установить в Solaris. AVFS обеспечивает доступ только для чтения к большинству распространенных форматов архивных файлов.

mountavfs
for z in ~/.avfs$PWD/*.Zip; do
  find "$z#" -exec grep ORA-1680 {} +
done
fusermount -u ~/.avfs   # optional
4
Gilles 'SO- stop being evil'