Простейшим подходом было бы перечислить содержимое архива и искать файлы соответствующего расширения. Например, с 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
был успешным.
foo
но неfoo.png
.