Вы говорите, что удаление файлов периодически со сценарием не достаточно быстро. Вы могли жить с триггером, который удаляет временный файл какое-либо время, которое Ваше приложение заканчивает писать и закрывает его? Если так, Вы могли бы использовать "inotify" API.
(См. http://en.wikipedia.org/wiki/Inotify и https://github.com/rvoicilas/inotify-tools/wiki/),
В целом не возможно искать содержание в сжатом файле, не распаковывая его так или иначе. Так как 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-файлы, но в зависимости от содержания файла и Вашего шаблона, Вы могли бы получить ложные положительные стороны и/или ложные отрицательные стороны.
zipgrep
берет единственный файл. Чтобы заставить его работать через несколько файлов помещает его в цикл:
for i in *.zip
do
zipgrep ORA-1680 "$i"
done
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
unzip -c
распаковывает файл к stdout. Это не пишет целый несжатый файл больше нигде. – Noah 11.08.2011, 15:40unzip
использование-p
для потоковой передачи для передачи по каналу! ошибки – gavenkoa 23.03.2016, 20:19