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