Я хотел бы отсканировать мой жесткий диск на наличие всех сжатых наборов файлов, таких как zip, gzip, bzip и других, и получить содержимое этих файлов для поиска определенных типов файлов (например, изображений). Это делают антивирусы, поэтому я считаю, что должен быть способ.
Самый простой подход должен был бы перечислить содержание архива и искать файлы соответствующего внутреннего абонента. Например, с 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
было успешно.
Не столь усовершенствованный как 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