Answers:
for z in *.zip; do if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 )); then echo "$z"; fi; done
这列出了.zip
要输出到标准输出(在终端中)少于15个文件的文件,因此,如果要创建列表文件,可以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
引用的变量表示$z
if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 ))
使解压缩计数文件,从输出中提取数字(肯定有一种更整齐的方法来仅提取数字,但是我知道sed
我已经用过了-请参阅@muru的注释以获取更简单的方法,对于许多文件来说可能更快)并测试是否小于15,是否小于15echo "$z"
然后打印文件名| tee small-zip-list
还将输出输出到新文件以及终端中 zipinfo
:zipinfo -1 foo.zip | wc -l
或zipinfo -t foo.zip | awk '{print $1}'
后期的python选项,使用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
它将计算相应的zip文件及其输出中的文件数,
awk 'END {print $(NF-1)}'
grep仅计数编号,如果小于15,则将打印文件名。
Perl还有一个用于处理zip归档文件的软件包Archive::Zip
。下面的脚本将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