जवाबों:
for z in *.zip; do if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 )); then echo "$z"; fi; done
यह .zip15 से कम फ़ाइलों के साथ स्टैडआउट (टर्मिनल में) को सूचीबद्ध करता है , इसलिए यदि आप एक सूची फ़ाइल बनाना चाहते हैं, तो आप teeबाहर या रीडायरेक्ट कर सकते हैं। यहां यह अधिक आसानी से है, टर्मिनल में छपाई के साथ-साथ अंत में एक सूची फ़ाइल बना रहा है
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और प्रत्येक के साथ कुछ करें, जिसे zसंदर्भित चर द्वारा दर्शाया गया है$zif (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 ))अनज़िप करें फाइलों को गिनें, आउटपुट से नंबर निकालें (निश्चित रूप से केवल नंबर निकालने के लिए एक कठिन तरीका है, लेकिन मुझे पता है कि sedमैंने इसका उपयोग किया है - सरल तरीके से @ muru की टिप्पणी देखें जो कई फ़ाइलों के साथ तेज़ हो सकती है) और परीक्षण करें कि क्या यह 15 से कम है, और यदि यह हैecho "$z" फिर फ़ाइल नाम मुद्रित करें| tee small-zip-list आउटपुट को एक नई फ़ाइल पर प्रिंट करें, साथ ही साथ टर्मिनल में भी zipinfo: zipinfo -1 foo.zip | wc -lयाzipinfo -t foo.zip | awk '{print $1}'
एक देर से अजगर विकल्प का उपयोग कर pythonके zipfile, (के रूप में @muru ने सुझाव दिया है, धन्यवाद!)
#!/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इसे निर्देशिका और वांछित (न्यूनतम) फ़ाइलों की संख्या के साथ चलाएं, जैसे:
python3 /path/to/get_zips.py /full/path/to/directory_with_zips 15
लिपी:
.zipनिर्देशिका के अंदर फ़ाइलों को सूचीबद्ध करता है:
for zp in [os.path.join(dr, f) for f in os.listdir(dr) if f.endswith(".zip")]:फ़ाइल के अंदर दिखता है और फ़ाइलों की संख्या की गणना करता है:
if len(ZipFile(file, "r").namelist()) < n:
print(file)
केवल फ़ाइल को प्रिंट करता है (+ पथ) यदि सूचीबद्ध वस्तुओं की संख्या छोटी है n।
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
या यह स्क्रिप्ट के साथ भी किया जा सकता है।
स्क्रिप्ट 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
इसे होम फोल्डर में सेव करें और इसे chmod +x zip.shटर्मिनल से निष्पादित करें और चलाएं./zip.sh
यहाँ if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 )),
unzip -l $i यह संबंधित ज़िप फ़ाइल से फ़ाइलों की संख्या और इसके आउटपुट से गणना करेगा,
awk 'END {print $(NF-1)}' grep जो केवल संख्या की गिनती करता है, यदि यह 15 से कम है तो यह फ़ाइल नाम प्रिंट करेगा।
पर्ल भी ज़िप अभिलेखागार से निपटने के लिए एक पैकेज है, Archive::Zip। नीचे दी गई स्क्रिप्ट ज़िप-फाइल को कमांड-लाइन तर्कों के रूप में लेती है और संग्रह के भीतर फाइलों के नाम और गणना के साथ कमांड-लाइन आउटपुट प्रदान करती है।
#!/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());
}
}
परीक्षण चालन:
$ ./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