可用 find 筛选指定大小区间文件并批量压缩为单个 zip:先用 find -size +1m -size -10m -print0 筛出 1mb–10mb 的普通文件,再通过 xargs -0 zip archive.zip 安全压缩;支持按类型过滤、排除已压缩文件,并可用 -n 分批处理防超长参数。

不能直接用 zip 配合 find 实现“对指定大小区间的文件批量压缩成一个 ZIP”,因为 zip 不支持从标准输入读取文件列表(不像 tar),但可以借助 find 生成文件路径,再交给 zip 批量处理——关键是控制好文件筛选和压缩逻辑。
用 find 筛出指定大小区间的文件
find 的 -size 参数支持按字节、KB、MB 等单位筛选,注意单位符号和比较逻辑:
-
+10M表示「大于 10MB」,-10M表示「小于 10MB」,10M表示「恰好 10MB」(极少匹配) - 要选「1MB 到 10MB 之间」的文件,得组合两个条件:
-size +1M -size -10M - 注意:单位不区分大小写(
M和m等效),但推荐用大写避免歧义
把筛选结果传给 zip 命令压缩成单个归档
使用 find ... -print0 | xargs -0 zip archive.zip 是安全可靠的方式,能正确处理含空格或特殊字符的路径:
-
-print0让find用 null 字符分隔文件名 -
xargs -0对应读取 null 分隔的输入,避免路径解析错误 - 命令示例:
find . -type f -size +1M -size -10M -print0 | xargs -0 zip assets_1M_10M.zip
避免重复压缩或跳过不支持的文件类型
实际批量压缩时建议加过滤条件,提升安全性和实用性:
- 限定文件类型:
-name "*.jpg" -o -name "*.png" -o -name "*.pdf"(用括号和\( ... \)分组更严谨) - 排除已压缩文件(如 zip、rar):
! -name "*.zip" ! -name "*.rar" - 跳过软链接(默认不跟随):
-type f已确保只处理普通文件
分批压缩防止命令行超长或内存溢出
如果匹配文件极多(比如上万),xargs 可能因参数过长失败。此时可用 -n 分批处理:
-
find ... -print0 | xargs -0 -n 100 zip -u assets_batch.zip:每次最多加 100 个文件到assets_batch.zip -
-u参数让 zip 更新已有归档,避免重复创建 - 若需多个独立 ZIP(如每 500 个文件一个包),可配合 shell 循环或
split处理











