Список zip-файлов, которые имеют меньше определенного количества файлов

У меня есть тысячи файлов .zip в одной папке. Я хочу узнать, какие zip-файлы имеют в них менее 15 файлов.

Я знаю, что unzip -l может отображать содержимое zip-файлов, но я не знаю, как создать вывод zip-файлов которые имеют менее 15 файлов.

1
задан 28 February 2017 в 12:52

3 ответа

Опция позднего питона с использованием python 's zipfile (как предложено @muru, спасибо!)

#!/usr/bin/env python3
import os
import sys
from zipfile import ZipFile

dr = sys.argv[1]

for zp in [os.path.join(dr, f) for f in os.listdir(dr) if f.endswith(".zip")]:
    if len(ZipFile(zp, "r").namelist()) < int(sys.argv[2]):
        print(zp)

Как использовать

Скопировать сценарий в пустой файл, сохраните его как get_zips.py Запустите его с каталогом и нужным (минимальным) количеством файлов внутри, например:
python3 /path/to/get_zips.py /full/path/to/directory_with_zips 15

Объяснение

Сценарий :

перечисляет файлы .zip внутри каталога:
for zp in [os.path.join(dr, f) for f in os.listdir(dr) if f.endswith(".zip")]:
Входит в файл и подсчитывает количество файлов:
if len(ZipFile(file, "r").namelist()) < n:
    print(file)
Только печатает файл (+ путь), если количество перечисленных элементов меньше затем n.
9
ответ дан 23 May 2018 в 01:03

Использование awk:

for i in ~/path/to/your/folder/*.zip; do if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 )); then echo "$i"; fi; done

Или это также можно сделать со скриптом.

Создать скрипт zip.sh

#!/bin/bash

for i in ~/path/to/your/folder/*.zip; do
    if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 )); then
        echo "$i"
    fi
done

Сохранить его в главная папка & amp; Сделайте его исполняемым с помощью chmod +x zip.sh и запустите с терминала ./zip.sh

Здесь if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 )),

unzip -l $i он будет подсчитывать количество файлов из соответствующего zip-файла & amp; с его выхода, awk 'END {print $(NF-1)}' grep, только число счетчиков, если оно меньше 15, тогда оно будет печатать имя файла.
9
ответ дан 23 May 2018 в 01:03

Perl также имеет пакет для обработки архивов zip, Archive::Zip. Нижеприведенный сценарий использует zip-файлы в качестве аргументов командной строки и предоставляет вывод командной строки с именем и количеством файлов в архиве.

#!/usr/bin/env perl
use strict;
use warnings;
use Archive::Zip;

foreach (@ARGV){
    my $fh = Archive::Zip::->new();
    if (my $error = $fh->read($_)){
        die "Read error:" . $_;
    }
    if($fh->numberOfMembers() < 15 ){
        printf("%s\t%d\n",$_,$fh->numberOfMembers());
    }
}

Тестирование:

$ ./count_zip_contents.pl  *.zip                           
129804-findmac.py.zip   1
Re%3a_China_and_East_Asia_%5bHIS-1250-010_31616.201730%5d%3a_Team_up_for_East_Asian_History_class.zip   4
University_Formal_jpg&tif.zip   5
indicator-places-master.zip 4
lab 5.zip   8
5
ответ дан 23 May 2018 в 01:03

Другие вопросы по тегам:

Похожие вопросы: