Risposte:
for z in *.zip; do if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 )); then echo "$z"; fi; done
Questo elenca i .zip
file con meno di 15 file da stdout (nel terminale), quindi se si desidera creare un file elenco, è possibile tee
eseguire l' output o il reindirizzamento. Qui è più leggibile, creando un file elenco alla fine e stampando nel terminale
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
.zip
passa in rassegna i file che terminano con e fanno qualcosa per ognuno, rappresentato dalla variabile a cui fa z
riferimento$z
if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 ))
fai decomprimere contare i file, estrai il numero dall'output (c'è sicuramente un modo più ordinato per estrarre solo il numero, ma lo so sed
quindi l'ho usato - vedi il commento di @ muru per un modo più semplice che potrebbe essere più veloce con molti file) e verifica se è inferiore a 15 e se lo èecho "$z"
quindi stampare il nome file| tee small-zip-list
stampa anche l'output su un nuovo file, così come nel terminale zipinfo
: zipinfo -1 foo.zip | wc -l
oppurezipinfo -t foo.zip | awk '{print $1}'
Un'opzione in ritardo di Python, usando python
's zipfile
, (come suggerito da @muru, grazie!)
#!/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
Eseguilo con la directory e il numero desiderato (minimo) di file all'interno, ad esempio:
python3 /path/to/get_zips.py /full/path/to/directory_with_zips 15
Il copione:
elenca i .zip
file all'interno di una directory:
for zp in [os.path.join(dr, f) for f in os.listdir(dr) if f.endswith(".zip")]:
Guarda all'interno del file e conta il numero di file:
if len(ZipFile(file, "r").namelist()) < n:
print(file)
Stampa il file (+ percorso) solo se il numero di elementi elencati è inferiore n
.
Usando 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
Oppure può essere fatto anche con lo script.
Crea 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
Salvalo nella cartella home e rendilo eseguibile con chmod +x zip.sh
ed eseguilo dal terminale./zip.sh
Ecco if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 ))
,
unzip -l $i
conterà il numero di file dal rispettivo file zip e dal suo output,
awk 'END {print $(NF-1)}'
grep che conta solo il numero, se è inferiore a 15, stampa il nome del file.
Perl ha anche un pacchetto per la gestione di archivi zip, Archive::Zip
. Lo script seguente accetta i file zip come argomenti della riga di comando e fornisce l'output della riga di comando con il nome e il conteggio dei file all'interno dell'archivio.
#!/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());
}
}
Prova:
$ ./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