Listen Sie Zip-Dateien auf, die weniger als eine bestimmte Anzahl von Dateien enthalten

10

Ich habe Tausende von .zipDateien in einem Ordner. Ich möchte herausfinden, welche Zip-Dateien weniger als 15 Dateien enthalten.

Ich weiß, dass unzip -lder Inhalt der Zip-Dateien aufgelistet werden kann, aber ich weiß nicht, wie eine Ausgabe von Zip-Dateien mit weniger als 15 Dateien erstellt werden soll.

Yarone
quelle

Antworten:

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

Dadurch werden die .zipDateien mit weniger als 15 zu stdout-Dateien (im Terminal) aufgelistet. Wenn Sie also eine Listendatei erstellen möchten, können Sie diese teeausgeben oder umleiten. Hier ist es besser lesbar, am Ende eine Listendatei zu erstellen und im Terminal zu drucken

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

Anmerkungen

  • for z in *.zipDurchlaufen Sie Dateien, die mit enden, .zipund tun Sie etwas mit jeder Datei , dargestellt durch die Variable, auf die zverwiesen wird$z
  • if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 ))Entpacken Sie die Dateien, extrahieren Sie die Nummer aus der Ausgabe (es gibt sicherlich eine übersichtlichere Möglichkeit, nur die Nummer zu extrahieren, aber ich weiß, seddass ich sie verwendet habe - siehe @ murus Kommentar für eine einfachere Methode, die bei vielen Dateien möglicherweise schneller ist). und testen Sie, ob es weniger als 15 ist und ob es ist
  • echo "$z" Drucken Sie dann den Dateinamen
  • | tee small-zip-list Drucken Sie die Ausgabe auch in eine neue Datei sowie im Terminal
Zanna
quelle
Vielen Dank @Zanna, ich habe versucht, das Feuerskript auszuführen, und es zeigt immer alle .zip-Dateinamen im Ordner an, auch wenn ich die Zahl von 15 auf etwas kleineres verkleinere, zeigt es alle .zip-Dateien im Ordner an.
Yarone
@yarone so sorry, ich habe ein Leerzeichen verpasst! Ich habe es jetzt behoben, ich hoffe, bitte versuchen Sie es erneut
Zanna
6
zipinfozipinfo -1 foo.zip | wc -lzipinfo -t foo.zip | awk '{print $1}'
Könnte
@yarone herzlich willkommen! : D
Zanna
+1 Verwendet eine der folgenden: awk, sed, grep;)
Nonny Moose
9

Eine späte Python-Option mit python's zipfile(wie von @muru vorgeschlagen, danke!)

#!/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)

Wie benutzt man

  1. Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter get_zips.py
  2. Führen Sie es mit dem Verzeichnis und der gewünschten (minimalen) Anzahl von Dateien aus, z.

    python3 /path/to/get_zips.py /full/path/to/directory_with_zips 15
    

Erläuterung

Das Skript:

  • listet .zipDateien in einem Verzeichnis auf:

    for zp in [os.path.join(dr, f) for f in os.listdir(dr) if f.endswith(".zip")]:
  • Schaut in die Datei und zählt die Anzahl der Dateien:

    if len(ZipFile(file, "r").namelist()) < n:
        print(file)

    Druckt die Datei (+ Pfad) nur, wenn die Anzahl der aufgelisteten Elemente kleiner ist n.

Jacob Vlijm
quelle
1
Python? zipfile !
Muru
@muru nochmals vielen Dank, das macht einen Unterschied :)
Jacob Vlijm
9

Mit 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

Oder es kann auch mit Skript gemacht werden.

Erstellen Sie das Skript 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

Speichern Sie es im Home-Ordner und machen Sie es ausführbar mit chmod +x zip.shund führen Sie es vom Terminal aus./zip.sh

Hier if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 )),,

  • unzip -l $i Es zählt die Anzahl der Dateien aus der jeweiligen Zip-Datei und aus ihrer Ausgabe.

  • awk 'END {print $(NF-1)}' grep nur diese Zählnummer, wenn es weniger als 15 ist, wird der Dateiname gedruckt.

Gänseblümchen
quelle
5

Perl hat auch ein Paket für die Verwaltung von Zip-Archiven Archive::Zip. Das folgende Skript verwendet Zip-Dateien als Befehlszeilenargumente und bietet eine Befehlszeilenausgabe mit Name und Anzahl der Dateien im Archiv.

#!/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());
    }
}

Testlauf:

$ ./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
quelle
0
for z in *.zip; do if (( $(unzip -Z1 "$z" | wc -l) < 15 )); then echo "$z"; fi;done
user1048382
quelle
eine geringfügige Änderung an @ zannas Code "$ (entpacken -Z1" $ z "| wc -l)"
user1048382
0

Holen Sie sich die Gesamtzahl der Dateien mit zipinfo:

$ for f in *.zip; do \
  a=($(zipinfo -t "$f")); \
  (($a > 15)) && echo $f; done
bac0n
quelle