Jawaban:
for z in *.zip; do if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 )); then echo "$z"; fi; done
Ini mencantumkan .zipfile dengan kurang dari 15 file ke stdout (di terminal), jadi jika Anda ingin membuat file daftar, Anda bisa teekeluar atau mengarahkan. Ini dia lebih mudah dibaca, membuat file daftar di akhir serta mencetak di 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 *.ziploop atas file yang diakhiri dengan .zipdan melakukan sesuatu untuk masing-masing, diwakili oleh variabel yang zdirujuk dengan$zif (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 ))buat unzip hitung file, ekstrak nomor dari output (pasti ada cara yang lebih rapi untuk mengekstrak hanya nomor, tapi saya tahu sedjadi saya sudah menggunakannya - lihat komentar @ muru untuk cara sederhana yang mungkin lebih cepat dengan banyak file) dan uji apakah kurang dari 15, dan jika yaecho "$z" lalu cetak nama file| tee small-zip-list juga mencetak output ke file baru, serta di terminal zipinfo: zipinfo -1 foo.zip | wc -latauzipinfo -t foo.zip | awk '{print $1}'
Opsi python terlambat, menggunakan python's zipfile, (seperti yang disarankan oleh @muru, terima kasih!)
#!/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.pyJalankan dengan direktori dan jumlah file yang diinginkan (minimal), misalnya:
python3 /path/to/get_zips.py /full/path/to/directory_with_zips 15
Naskah:
daftar .zipfile di dalam direktori:
for zp in [os.path.join(dr, f) for f in os.listdir(dr) if f.endswith(".zip")]:Lihat ke dalam file dan menghitung jumlah file:
if len(ZipFile(file, "r").namelist()) < n:
print(file)
Hanya mencetak file (+ path) jika jumlah item yang terdaftar lebih kecil n.
Menggunakan 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
Atau bisa juga dengan script.
Buat skrip 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
Simpan di folder rumah & Jadikan itu dapat dieksekusi dengan chmod +x zip.shdan jalankan dari terminal./zip.sh
Di sini if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 )),
unzip -l $i itu akan menghitung jumlah file dari masing-masing file zip & dari outputnya,
awk 'END {print $(NF-1)}' grep yang hanya menghitung angka, jika kurang dari 15 maka akan mencetak nama file.
Perl juga memiliki paket untuk menangani arsip zip Archive::Zip,. Skrip di bawah ini mengambil file zip sebagai argumen baris perintah dan memberikan output baris perintah dengan nama dan jumlah file dalam arsip.
#!/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());
}
}
Uji coba:
$ ./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