for z in *.zip; do if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 )); then echo "$z"; fi; done
Здесь перечислены .zip
файлы с менее чем 15 файлами на стандартный вывод (в терминале), поэтому, если вы хотите создать файл списка, вы можете tee
выполнить его или перенаправить. Здесь это более читабельно, создание списка файлов в конце, а также печать в терминале
for z in *.zip; do
if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 )); then
echo "$z"
fi
done | tee small-zip-list
Заметки
for z in *.zip
Зацикливать файлы, заканчивающиеся на .zip
и делать что-то для каждого, представленного переменной, на которую z
ссылается$z
if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 ))
сделать unzip подсчитать файлы, извлечь число из выходных данных (конечно, есть более простой способ извлечь только число, но я знаю, sed
что я использовал его - см . комментарий @ muru для более простого способа, который может быть быстрее со многими файлами) и проверить, меньше ли это 15, и если это
echo "$z"
затем напечатайте имя файла
| tee small-zip-list
также распечатать вывод в новый файл, а также в терминал
zipinfo
:zipinfo -1 foo.zip | wc -l
илиzipinfo -t foo.zip | awk '{print $1}'
Поздний вариант python, использующий
python
's'zipfile
(как предложено @muru, спасибо!)Как пользоваться
get_zips.py
Запустите его с каталогом и желаемым (минимальным) количеством файлов внутри, например:
объяснение
Сценарий:
выводит список
.zip
файлов внутри каталога:Заглядывает внутрь файла и считает количество файлов:
Печатает файл (+ путь), только если число перечисленных элементов меньше, чем
n
.источник
Использование awk :
Или это также можно сделать с помощью сценария.
Создать скрипт zip.sh
Сохраните его в домашней папке и сделайте его исполняемым
chmod +x zip.sh
и запустите из терминала./zip.sh
Здесь
if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 ))
,unzip -l $i
он будет считать количество файлов из соответствующего zip-файла и из его вывода,awk 'END {print $(NF-1)}'
grep, что считать только число, если оно меньше 15, то будет напечатано имя файла.источник
В Perl также есть пакет для работы с zip-архивами
Archive::Zip
. Приведенный ниже скрипт принимает zip-файлы в качестве аргументов командной строки и обеспечивает вывод в командной строке с именем и количеством файлов в архиве.Тестовый забег:
источник
источник
Получить общее количество файлов, используя zipinfo:
источник