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


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.