Найти и искать внутри всех сжатых файлов

9

Я хотел бы отсканировать мой жесткий диск на наличие всех сжатых наборов файлов, таких как zip, gzip, bzip и других, и найти содержимое этих файлов для определенных типов файлов (например, изображений). Антивирус », поэтому я считаю, что должен быть способ.

6 футов Дан
источник
@Rinzwind, который будет искать в файлах архива, а не в списке файлов. Он найдет файлы, содержащие, fooно не foo.png.
тердон
Это может быть полезно для проверки на Zip Bomb! +1
Шарад Гаутам

Ответы:

17

Простейшим подходом было бы перечислить содержимое архива и искать файлы соответствующего расширения. Например, с zipфайлом:

$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
  file1.jpg
  file1.png
  file2.jpg
  file2.png

-sfОпция указывает zipна список файлов , содержащихся в архиве. Затем, grepпоиск будет .pngили .jpgв конце строки ( $). -EПозволяет расширенные регулярные выражения, поэтому мы можем использовать , |как OR и -iделает соответствующий нечувствительны к регистру.

Однако у каждого инструмента архивации есть своя команда для просмотра содержимого. Я написал сценарий, который может работать с большинством наиболее популярных. Если вы сохраните этот скрипт как list_compressed.sh, вы можете запустить:

list_compressed.sh | grep -iE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$'

Это покажет вам наиболее распространенные типы изображений. Обратите внимание, что этот подход предполагает, что тип файла может быть определен по расширению файла. Он не найдет файлы изображений, которые не имеют расширения, и не распознает файлы с неправильным расширением. Нет способа справиться с этим без фактического извлечения файлов из архива и запуска fileна каждом из них.


Если вы хотите найти все архивы, содержащие файлы изображений на вашем жестком диске, объедините вышеперечисленное с find:

find / -name '*.gz' -o -name '*.tgz' -o -name '*.zip' -print0 |
    while IFS= read -r -d '' arch; do    
        list_compressed.sh "$arch" | 
            grep -qiE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$' &&
                echo "$arch contains image(s)"
    done

Команда находки будет искать все .gz, .tgzили .zipфайлы (вы можете добавить много расширений , как вам нравится), те , которые затем пропускают через мой сценарий. В -qПодавляете Grep нормально выход, ничего не будет напечатано. && echoНапечатает имя архива , только если grepбыл успешным.

terdon
источник
Согласно моему первоначальному вопросу, я хотел бы «отсканировать мой жесткий диск на наличие всех сжатых файлов, таких как zip, которые содержат изображения». Вы помогли заглянуть в сами архивы, но я просто хочу определить, какие архивы содержат изображения.
футов Дан
@ 6ftДан извините, я не видел оригинал. Пожалуйста, не стесняйтесь откатить или отредактировать любое изменение, которое меняет смысл вашего сообщения. Смотрите обновленный ответ о том, как искать всю файловую систему.
тердон
Отлично, но, поскольку вы используете регистр без учета регистра, может быть, вы хотите выполнять поиск без учета регистра?
Кос
@kos Хм, это достаточно просто сделать, просто перейдя -nameна -iname. Однако в этом нет особого смысла: многим программам сжатия (например, gzip) требуется конкретное расширение. GZне сработает
тердон
3

Не так продвинут, как тердон, но это подойдет:

Сохраните следующий код в папке, где находится весь ваш код, под finda.shлюбым другим именем, как вам нравится:

for file in *.*; do
    if ( 7z l -slt "$file"> /tmp/$file.log); then
       echo $file:; cat /tmp/$file.log | grep -iE 'Path*'> $file.log && cat $file.log
    fi
done

Затем в директории, в которой находятся все ваши архивы, запустите ее, и это вывод:

./finda.sh 
one.7z:
Path = one/abradabra.png
Path = one/birb.png
three.rar:
Path = three/blah.png
Path = three/qwa0g.jpg
two.zip:
Path = two/whut.png
blade19899
источник
Согласно моему первоначальному вопросу, я хотел бы «отсканировать мой жесткий диск на наличие всех сжатых файлов, таких как zip, которые содержат изображения». Вы помогли заглянуть в сами архивы, но я просто хочу определить, какие архивы содержат изображения.
футов Дан
@ 6ftDan Это, я думаю, возможно, но может занять некоторое время. В то же время, я добавил некоторые улучшения в свой скрипт, с помощью Terdon.
blade19899
Обратите внимание, что *.*будут соответствовать только файлы с расширением. Кроме того, это будет список всех файлов во всех архивах, вы не проверяете для любого типа файла.
тердон