Réponses:
for z in *.zip; do if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 )); then echo "$z"; fi; done
Cela répertorie les .zip
fichiers avec moins de 15 fichiers à stdout (dans le terminal), donc si vous souhaitez créer un fichier de liste, vous pouvez le tee
retirer ou le rediriger. Ici, c'est plus lisible, la création d'un fichier de liste à la fin ainsi que l'impression dans le terminal
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
faire une boucle sur les fichiers se terminant par .zip
et faire quelque chose pour chacun, représenté par la variable z
référencée par$z
if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 ))
faire décompresser les fichiers, extraire le nombre de la sortie (il y a sûrement un moyen plus ordonné d'extraire uniquement le nombre, mais je sais sed
que je l'ai utilisé - voir le commentaire de @ muru pour un moyen plus simple qui peut être plus rapide avec de nombreux fichiers) et tester si elle est inférieure à 15, et si elle estecho "$z"
puis imprimez le nom du fichier| tee small-zip-list
également imprimer la sortie dans un nouveau fichier, ainsi que dans le terminal zipinfo
: zipinfo -1 foo.zip | wc -l
ouzipinfo -t foo.zip | awk '{print $1}'
Une option python tardive, utilisant python
's zipfile
, (comme suggéré par @muru, merci!)
#!/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
Exécutez-le avec le répertoire et le nombre de fichiers (minimum) souhaité à l'intérieur, par exemple:
python3 /path/to/get_zips.py /full/path/to/directory_with_zips 15
Le scénario:
répertorie les .zip
fichiers dans un répertoire:
for zp in [os.path.join(dr, f) for f in os.listdir(dr) if f.endswith(".zip")]:
Regarde à l'intérieur du fichier et compte le nombre de fichiers:
if len(ZipFile(file, "r").namelist()) < n:
print(file)
N'imprime le fichier (+ chemin d'accès) que si le nombre d'éléments répertoriés est plus petit n
.
Utiliser 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
Ou cela peut aussi être fait avec un script.
Créer un script 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
Enregistrez-le dans le dossier d'accueil et rendez-le exécutable avec chmod +x zip.sh
et exécutez à partir du terminal./zip.sh
Ici, if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 ))
,
unzip -l $i
il comptera le nombre de fichiers du fichier zip respectif et de sa sortie,
awk 'END {print $(NF-1)}'
grep ce nombre de comptage uniquement, s'il est inférieur à 15, il affichera le nom du fichier.
Perl dispose également d' un package pour le traitement des archives zip, Archive::Zip
. Le script ci-dessous prend les fichiers zip comme arguments de ligne de commande et fournit une sortie de ligne de commande avec le nom et le nombre de fichiers dans l'archive.
#!/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());
}
}
Essai:
$ ./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
for z in *.zip; do if (( $(unzip -Z1 "$z" | wc -l) < 15 )); then echo "$z"; fi;done