Odpowiedzi:
for z in *.zip; do if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 )); then echo "$z"; fi; done
Wyświetla listę .zip
plików zawierających mniej niż 15 plików na standardowe wyjście (w terminalu), więc jeśli chcesz utworzyć plik listy, możesz tee
wyjść lub przekierować. Tutaj jest to bardziej czytelne, tworząc plik listy na końcu, a także drukując w terminalu
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
zapętlaj pliki kończące się na .zip
i zrób coś dla każdego z nich, reprezentowane przez zmienną, z
do której się odwołuje$z
if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 ))
rozpakuj liczenie plików, wyodrębnij liczbę z danych wyjściowych (z pewnością jest bardziej uporządkowany sposób, aby wyodrębnić tylko liczbę, ale wiem sed
, że ją wykorzystałem - zobacz komentarz @ muru dla prostszego sposobu, który może być szybszy w przypadku wielu plików) i sprawdź, czy jest mniej niż 15, a jeśli takecho "$z"
następnie wydrukuj nazwę pliku| tee small-zip-list
również wypisuje dane wyjściowe do nowego pliku, a także w terminalu zipinfo
: zipinfo -1 foo.zip | wc -l
lubzipinfo -t foo.zip | awk '{print $1}'
Późna opcja Pythona, używając python
's zipfile
, (jak sugeruje @muru, dzięki!)
#!/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
Uruchom go z katalogiem i pożądaną (minimalną) liczbą plików w środku, np .:
python3 /path/to/get_zips.py /full/path/to/directory_with_zips 15
Scenariusz:
wyświetla listę .zip
plików w katalogu:
for zp in [os.path.join(dr, f) for f in os.listdir(dr) if f.endswith(".zip")]:
Przeszukuje plik i liczy liczbę plików:
if len(ZipFile(file, "r").namelist()) < n:
print(file)
Drukuje plik (+ ścieżkę) tylko wtedy, gdy liczba wymienionych elementów jest mniejsza niż n
.
Za pomocą 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
Lub można to również zrobić za pomocą skryptu.
Utwórz skrypt 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
Zapisz go w folderze domowym chmod +x zip.sh
i uruchom go z terminala./zip.sh
Tutaj if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 ))
,
unzip -l $i
policzy liczbę plików z odpowiedniego pliku zip i jego wyniku,
awk 'END {print $(NF-1)}'
grep, który zlicza tylko liczbę, jeśli jest mniejsza niż 15, to wypisze nazwę pliku.
Perl posiada również pakiet do obsługi archiwów zip, Archive::Zip
. Poniższy skrypt przyjmuje pliki zip jako argumenty wiersza poleceń i udostępnia dane wyjściowe wiersza polecenia z nazwą i liczbą plików w archiwum.
#!/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());
}
}
Testowe uruchomienie:
$ ./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