Поиск строки на нескольких zip-файлах

Вы говорите, что удаление файлов периодически со сценарием не достаточно быстро. Вы могли жить с триггером, который удаляет временный файл какое-либо время, которое Ваше приложение заканчивает писать и закрывает его? Если так, Вы могли бы использовать "inotify" API.

(См. http://en.wikipedia.org/wiki/Inotify и https://github.com/rvoicilas/inotify-tools/wiki/),

24
19.03.2019, 12:43
3 ответа

В целом не возможно искать содержание в сжатом файле, не распаковывая его так или иначе. Так как 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

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

27
27.01.2020, 19:40
  • 1
    Где первая опция разархивировала бы файлы к? право А-ч –  ziggy 11.08.2011, 15:02
  • 2
    unzip -c распаковывает файл к stdout. Это не пишет целый несжатый файл больше нигде. –  Noah 11.08.2011, 15:40
  • 3
    +1, спасибо много, это сохраняет мой день. Я juste добавляю эхо "$file"; разархивируйте-c "$file" | grep-q "РТЫ 1680"; знать имя файла + результат. –  Mike Castro Demaria 03.08.2014, 10:38
  • 4
    Моя версия unzip использование -p для потоковой передачи для передачи по каналу! ошибки –  gavenkoa 23.03.2016, 20:19
  • 5
    Это работает, где вся одна строка управляет возвращенным "стандартным выводом", не протестированным дымом имени файла +1 –  alimack 15.06.2017, 19:40

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

for i in *.zip
do
   zipgrep ORA-1680 "$i"
done
17
27.01.2020, 19:40
  • 1
    В одной строке, которые также печатают имя файла zip, если существует соответствие: for i in *.zip; do zipgrep TextToSearch $i && echo $i; done –  baptx 02.03.2015, 15:04

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

mountavfs
for z in ~/.avfs$PWD/*.zip; do
  find "$z#" -exec grep ORA-1680 {} +
done
fusermount -u ~/.avfs   # optional
4
27.01.2020, 19:40

Теги

Похожие вопросы