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.

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

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.


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.


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

0
for z in *.zip; do if (( $(unzip -Z1 "$z" | wc -l) < 15 )); then echo "$z"; fi;done

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.