Câu trả lời:
for z in *.zip; do if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 )); then echo "$z"; fi; done
Điều này liệt kê các .zip
tệp có ít hơn 15 tệp vào thiết bị xuất chuẩn (trong thiết bị đầu cuối), vì vậy nếu bạn muốn tạo một tệp danh sách, bạn có thể tee
thoát ra hoặc chuyển hướng. Ở đây dễ đọc hơn, tạo một tệp danh sách ở cuối cũng như in trong thiết bị đầu cuối
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
lặp qua các tệp kết thúc bằng .zip
và làm một cái gì đó cho từng tệp , được biểu thị bằng biến được z
tham chiếu với$z
if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 ))
giải nén số tập tin, trích xuất số từ đầu ra (chắc chắn có một cách gọn gàng hơn để chỉ trích xuất số, nhưng tôi biết sed
vì vậy tôi đã sử dụng nó - xem nhận xét của @ muru để biết cách đơn giản hơn có thể nhanh hơn với nhiều tệp) và kiểm tra xem nó có nhỏ hơn 15 không, và nếu nó làecho "$z"
sau đó in tên tệp| tee small-zip-list
cũng in đầu ra sang một tệp mới, cũng như trong thiết bị đầu cuối zipinfo
: zipinfo -1 foo.zip | wc -l
hoặczipinfo -t foo.zip | awk '{print $1}'
Tùy chọn python muộn, sử dụng python
's zipfile
, (như được đề xuất bởi @muru, cảm ơn!)
#!/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
Chạy nó với thư mục và số lượng tệp (tối thiểu) mong muốn bên trong, ví dụ:
python3 /path/to/get_zips.py /full/path/to/directory_with_zips 15
Kịch bản:
liệt kê .zip
các tập tin trong một thư mục:
for zp in [os.path.join(dr, f) for f in os.listdir(dr) if f.endswith(".zip")]:
Nhìn vào bên trong tệp và đếm số lượng tệp:
if len(ZipFile(file, "r").namelist()) < n:
print(file)
Chỉ in tệp (đường dẫn +) nếu số lượng mục được liệt kê nhỏ hơn n
.
Sử dụng 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
Hoặc nó cũng có thể được thực hiện với kịch bản.
Tạo tập lệnh 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
Lưu nó trong thư mục nhà và làm cho nó thực thi được chmod +x zip.sh
và chạy từ thiết bị đầu cuối./zip.sh
Đây if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 ))
,
unzip -l $i
nó sẽ đếm số lượng tệp từ tệp zip tương ứng & từ đầu ra của nó,
awk 'END {print $(NF-1)}'
grep chỉ đếm số, nếu nó nhỏ hơn 15 thì nó sẽ in tên tệp.
Perl cũng có một gói để xử lý tài liệu lưu trữ zip , Archive::Zip
. Kịch bản bên dưới lấy các tệp zip làm đối số dòng lệnh và cung cấp đầu ra dòng lệnh với tên và số lượng tệp trong kho lưu trữ.
#!/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());
}
}
Chạy thử nghiệm:
$ ./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