我的一个文件夹中有数千个.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(在终端中),因此如果您想创建列表文件,可以tee
out 或重定向。这里更易于阅读,在最后创建一个列表文件,并在终端中打印
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)
如何使用
- 将脚本复制到一个空文件中,另存为
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
。
答案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