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

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

10
задан 19 April 2017 в 15:03

2 ответа

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

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

-sf опция говорит zip перечислять файлы, содержавшиеся в архиве. Затем grep будет искать a .png или .jpg это в конце строки ($). -E включает расширенные регулярные выражения, таким образом, мы можем использовать | как ИЛИ и -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 было успешно.

18
ответ дан 19 April 2017 в 15:03

Не столь усовершенствованный как terdon, но это сделает:

Сохраняют следующий код, в папке, где весь Ваш код находится в, как 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

Тогда в dir были все Ваши архивы, находятся в, выполните его, и это - вывод:

./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
0
ответ дан 19 April 2017 в 15:03

Другие вопросы по тегам:

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