Yanıtlar:
for z in *.zip; do if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 )); then echo "$z"; fi; done
Bu, .zip
stdout'ta (terminalde) 15'ten az dosya içeren dosyaları listeler , böylece bir liste dosyası oluşturmak isterseniz, tee
dışarı veya yeniden yönlendirebilirsiniz. Burada daha okunabilir bir şekilde, sonunda bir liste dosyası oluşturmak ve terminalde yazdırmak
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
ile biten dosyalar üzerinde döngü yapın .zip
ve her birine bir şey yapın z
;$z
if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 ))
dosyaları açmak, çıktıyı numarayı ayıklamak yapmak (kesinlikle sadece sayı ayıklamak için daha düzenli bir yol var, ama sed
bunu kullandım biliyorum - birçok dosya ile daha hızlı olabilir daha basit bir yol için @ muru'nun yorum bakınız ) 15 yaşından küçük olup olmadığını veecho "$z"
sonra dosya adını yazdır| tee small-zip-list
ayrıca çıktıyı yeni bir dosyaya ve terminalde yazdır zipinfo
: zipinfo -1 foo.zip | wc -l
veyazipinfo -t foo.zip | awk '{print $1}'
python
'S kullanarak geç bir python seçeneği, zipfile
(muru tarafından önerildiği gibi, teşekkürler!)
#!/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
Dizini ve içinde istenen (minimum) sayıda dosyayla çalıştırın, örneğin:
python3 /path/to/get_zips.py /full/path/to/directory_with_zips 15
Senaryo:
.zip
bir dizindeki dosyaları listeler :
for zp in [os.path.join(dr, f) for f in os.listdir(dr) if f.endswith(".zip")]:
Dosyanın içine bakar ve dosya sayısını sayar:
if len(ZipFile(file, "r").namelist()) < n:
print(file)
Dosyayı (+ yol) yalnızca listelenen öğelerin sayısı daha azsa yazdırır n
.
Awk kullanma :
for i in ~/path/to/your/folder/*.zip; do if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 )); then echo "$i"; fi; done
Veya senaryo ile de yapılabilir.
Komut dosyası zip.sh oluştur
#!/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
Ana klasöre kaydedin ve chmod +x zip.sh
terminal ile çalıştırılabilir yapın ve terminalden çalıştırın./zip.sh
Burada if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 ))
,
unzip -l $i
ilgili zip dosyasından ve çıktısından dosya sayısını sayar,
awk 'END {print $(NF-1)}'
grep sadece sayı sayılır, 15'den küçükse dosya adını yazdıracaktır.
Perl ayrıca zip arşivlerini işlemek için bir pakete sahiptir Archive::Zip
. Aşağıdaki komut dosyası zip dosyalarını komut satırı bağımsız değişkenleri olarak alır ve arşiv içindeki dosya adlarını ve sayısını içeren komut satırı çıktısını sağlar.
#!/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());
}
}
Test sürüşü:
$ ./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