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

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

我的一个文件夹中有数千个.zip文件。我希望找出哪些 zip 文件中的文件少于 15 个。

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

答案1

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 个文件的文件列到 stdout(在终端中),因此如果您想创建列表文件,可以teeout 或重定向。这里更易于阅读,在最后创建一个列表文件,并在终端中打印

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

答案2

一个后期的 python 选项,使用python's 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)

如何使用

  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

答案3

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

答案4

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

相关内容