Знайдіть і шукайте все стиснені файли


9

Я хотів би сканувати свій жорсткий диск на всі колекції стислих файлів, таких як zip, gzip, bzip та інші, і вміст тих, хто шукав для певних типів файлів (наприклад, зображень). Антивіруси 'роблять це, тому я вважаю, що має бути спосіб.


@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успішно виконано.


Відповідно до мого оригінального запитання, я хотів би "сканувати свій жорсткий диск для всіх стислих колекцій файлів, як-от zip, що містять зображення". Ви допомагали шукати самі архіви, але я просто хочу визначити, які архіви містять зображення.
6 футів Дан

@ 6ftDan вибачте, оригінал я не бачив. Будь ласка, не соромтеся відкочувати або відредагувати будь-які зміни, які змінюють значення вашої публікації. Дивіться оновлену відповідь, як шукати всю файлову систему.
тердон

Чудово, але, оскільки ви чіпляєте регістр без чутливості, можливо, ви хочете також шукати регістр без чутливості?
kos

@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

Відповідно до мого оригінального запитання, я хотів би "сканувати свій жорсткий диск для всіх стислих колекцій файлів, як-от zip, що містять зображення". Ви допомагали шукати самі архіви, але я просто хочу визначити, які архіви містять зображення.
6 футів Дан

@ 6ftDan Це, я думаю, можливо, але може зайняти деякий час. Тим часом я додав деякі вдосконалення до свого сценарію, але допомогти тердон.
blade19899

Зверніть увагу, що *.*відповідатимуть лише файли з розширенням. Крім того, у цьому списку будуть вказані всі файли в усіх архівах, ви не тестуєте жоден тип файлу.
тердон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.