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

10

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

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

    
задан yarone 28.02.2017 в 08:24
источник

4 ответа

14
for z in *.zip; do if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?//p') < 15 )); then echo "$z"; fi; done

Здесь перечислены файлы .zip с менее чем 15 файлами в stdout (в терминале), поэтому, если вы хотите создать файл списка, вы можете tee out или перенаправить. Здесь это более читаемо, создавая в конце файл списка, а также печать в терминале

for z in *.zip; do 
   if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?//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?//p') < 15 )) make unzip подсчитывает файлы, извлекает номер из вывода (есть, конечно, более аккуратный способ извлечь только номер, но я знаю sed , поэтому я его использовал - см. комментарий@muru для более простой способ, который может быть быстрее со многими файлами) и проверить, меньше ли оно, чем 15, и если оно
  • echo "$z" затем распечатать имя файла
  • | tee small-zip-list также выводит вывод на новый файл, а также на терминал
ответ дан Zanna 28.02.2017 в 08:50
источник
9

Опция позднего python, использующая python 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)

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

  1. Скопируйте сценарий в пустой файл, сохраните его как get_zips.py
  2. Запустите его с каталогом и нужным (минимальным) количеством файлов внутри, например:

    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 .

ответ дан Jacob Vlijm 28.02.2017 в 09:47
9

Использование 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 будет подсчитывать количество файлов из соответствующего почтового индекса файл & amp; с его выхода,

  • awk 'END {print $(NF-1)}' grep, только число count, если оно менее 15, тогда он будет печатать имя файла.

ответ дан d a i s y 28.02.2017 в 09:26
5

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
    
ответ дан Sergiy Kolodyazhnyy 28.02.2017 в 19:05