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


10

.zip在一个文件夹中有数千个文件。我希望找到哪些压缩文件少于15个文件。

我知道unzip -l可以列出zip文件的内容,但是我不知道如何创建少于15个文件的zip文件输出。

Answers:


14
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,是否小于15
  • echo "$z" 然后打印文件名
  • | tee small-zip-list 还将输出输出到新文件以及终端中

谢谢@Zanna,我尝试运行fires脚本,它始终显示文件夹中的所有.zip文件名,即使我将数字形式从15减小到较小的值,它也显示了文件夹中的所有.zip文件。
yarone

@yarone很抱歉,我错过了空格!我现在已解决它,希望,请再试一次
Zanna

6
可能会更易于使用zipinfozipinfo -1 foo.zip | wc -lzipinfo -t foo.zip | awk '{print $1}'
muru

@yarone非常欢迎!:D
Zanna

+1使用以下选项之一:awk,sed,grep;)
Nonny Moose

9

后期的python选项,使用pythonzipfile,(如@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)

如何使用

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

    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


1
蟒蛇?压缩文件
muru

@muru再次感谢,这有所不同:)
Jacob Vlijm '17

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

或者也可以使用脚本来完成。

创建脚本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,则将打印文件名。


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());
    }
}

测试运行:

$ ./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

0
for z in *.zip; do if (( $(unzip -Z1 "$z" | wc -l) < 15 )); then echo "$z"; fi;done

@zanna的代码“ $(unzip -Z1“ $ z” | wc -l)“的微小更改
user1048382

0

使用zipinfo获取文件总数:

$ for f in *.zip; do \
  a=($(zipinfo -t "$f")); \
  (($a > 15)) && echo $f; done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.