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 .zip
file dengan kurang dari 15 file ke stdout (di terminal), jadi jika Anda ingin membuat file daftar, Anda bisa tee
keluar 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 *.zip
loop atas file yang diakhiri dengan .zip
dan melakukan sesuatu untuk masing-masing, diwakili oleh variabel yang z
dirujuk dengan$z
if (( $(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 sed
jadi 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 -l
atauzipinfo -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.py
Jalankan dengan direktori dan jumlah file yang diinginkan (minimal), misalnya:
python3 /path/to/get_zips.py /full/path/to/directory_with_zips 15
Naskah:
daftar .zip
file 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.sh
dan 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