Пошук рядка в кількох поштових файлах


22

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

Я спробував це (який шукає будь-який текстовий файл у zip-файлі, що містить рядок "ORA-"), але це не спрацювало.

zipgrep ORA-1680 *.zip

Що правильного робити це без розпакування zip-файлів?


Дивіться також Як я рекурсивно переглядаю стиснуті архіви? (не точний дублікат, тому що вимоги були складнішими).
Жил 'SO- перестань бути злим'

Відповіді:


26

Взагалі неможливо шукати вміст у стисненому файлі, не стискаючи його так чи інакше. Оскільки zipgrep - це лише оболонка, яка розгортає розпакування та перемикання, ви також можете зробити це вручну:

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поштові файли, але залежно від вмісту файлу та вашого шаблону, ви можете отримати помилкові позитиви та / або помилкові негативи.


Де б перший варіант розпакувати файли?
ziggy

2
unzip -cрозпаковує файл на stdout. Він не записує весь нестиснений файл ніде більше.
Ной

+1 tks багато, це врятує мені день. Я додаю відлуння "$ file"; распакуйте -c "$ файл" | grep -q "ORA-1680"; знати ім'я файлу + результат.
Майк

2
Моя версія unzipвикористовує -pдля потокової передачі в трубу!
gavenkoa

Це працює, коли всі команди одного рядка повернули "стандартний вихід", а не ім'я файлу +1
alimack

16

zipgrepзаймає один файл. Щоб він працював у кількох файлах, покладіть його в цикл:

for i in *.zip
do
   zipgrep ORA-1680 "$i"
done

2
В одному рядку, який також друкує zip-файл, якщо є відповідність:for i in *.zip; do zipgrep TextToSearch $i && echo $i; done
baptx

4

У АВФ файлова система являє собою вид файлової системи , де кожен архівний файл /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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.