列出少于特定文件数的 zip 文件

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引用的变量表示$z
  • if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 ))使解压缩对文件进行计数,从输出中提取数字(肯定有一种更简洁的方法可以只提取数字,但我知道sed所以我已经使用了它 - 请参阅@muru 的评论,了解一种更简单的方法,该方法可能会更快处理许多文件)并测试它是否小于15,如果是
  • echo "$z" 然后打印文件名
  • | tee small-zip-list 还将输出打印到新文件以及终端

  • 使用 `zipinfo` 可能稍微容易一些:`zipinfo -1 foo.zip | wc -l` 或 `zipinfo -t foo.zip | awk '{print $1}'` (6认同)

d a*_*s y 9

使用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,那么它将打印文件名。


Jac*_*ijm 9

使用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)

如何使用

  1. 将脚本复制到一个空文件中,另存为 get_zips.py
  2. 使用目录和所需的(最小)文件数运行它,例如:

    python3 /path/to/get_zips.py /full/path/to/directory_with_zips 15
    
    Run Code Online (Sandbox Code Playgroud)

解释

剧本:


Ser*_*nyy 5

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)