Я хотів би сканувати свій жорсткий диск на всі колекції стислих файлів, таких як zip, gzip, bzip та інші, і вміст тих, хто шукав для певних типів файлів (наприклад, зображень). Антивіруси 'роблять це, тому я вважаю, що має бути спосіб.
Я хотів би сканувати свій жорсткий диск на всі колекції стислих файлів, таких як zip, gzip, bzip та інші, і вміст тих, хто шукав для певних типів файлів (наприклад, зображень). Антивіруси 'роблять це, тому я вважаю, що має бути спосіб.
Відповіді:
Найпростішим підходом було б перерахувати вміст архіву та шукати файли відповідного розширення. Наприклад, з 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
успішно виконано.
-name
в -iname
. Однак у цьому мало сенсу, багато програм стиснення (наприклад, gzip) потребують певного розширення. GZ
не буде працювати.
Не такий просунутий, як тердон, але це зробить:
Збережіть наступний код у папці, де весь ваш код знаходиться, як 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
*.*
відповідатимуть лише файли з розширенням. Крім того, у цьому списку будуть вказані всі файли в усіх архівах, ви не тестуєте жоден тип файлу.
foo
але ніfoo.png
.