yar*_*one 10 command-line files unzip
我.zip在一个文件夹中有数千个文件。我希望找到哪些 zip 文件中的文件少于 15 个。
我知道unzip -l可以列出 zip 文件的内容,但我不知道如何创建少于 15 个文件的 zip 文件的输出。
Zan*_*nna 14
for z in *.zip; do if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 )); then echo "$z"; fi; done
Run Code Online (Sandbox Code Playgroud)
这会将.zip少于 15 个文件的文件列出到 stdout(在终端中),因此如果您想创建列表文件,您可以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
Run Code Online (Sandbox Code Playgroud)
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 还将输出打印到新文件以及终端 使用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
Run Code Online (Sandbox Code Playgroud)
或者也可以用脚本来完成。
创建脚本 zip.sh
for i in ~/path/to/your/folder/*.zip; do if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 )); then echo "$i"; fi; done
Run Code Online (Sandbox Code Playgroud)
将其保存在主文件夹中并使其可执行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,那么它将打印文件名。
使用python's 的晚期 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)
Run Code Online (Sandbox Code Playgroud)
get_zips.py使用目录和所需的(最小)文件数运行它,例如:
python3 /path/to/get_zips.py /full/path/to/directory_with_zips 15
Run Code Online (Sandbox Code Playgroud)剧本:
列出目录中的.zip文件:
python3 /path/to/get_zips.py /full/path/to/directory_with_zips 15
Run Code Online (Sandbox Code Playgroud)查看文件内部并计算文件数:
for zp in [os.path.join(dr, f) for f in os.listdir(dr) if f.endswith(".zip")]:
Run Code Online (Sandbox Code Playgroud)
如果列出的项目数小于 ,则仅打印文件(+路径)n。
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());
}
}
Run Code Online (Sandbox Code Playgroud)
测试运行:
$ ./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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1915 次 |
| 最近记录: |