You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

tar按文件名日期打包前检查文件存在性,避免生成空tar包

解决tar打包日期匹配文件时生成空包的问题

我完全懂你的困扰——直接用通配符打包时,只要没匹配到目标日期的文件,tar就会报错还生成空包,实在闹心。下面给你几个靠谱的解决办法,核心思路都是先确认有匹配文件再执行打包:

方法1:用Shell数组+nullglob选项(推荐,兼容带空格的文件名)

这个方法利用Shell的nullglob特性,让通配符匹配不到文件时直接“消失”,不会被当作字符串传给tar:

# 开启nullglob:通配符无匹配时返回空,而非原样保留
shopt -s nullglob

# 设置你要打包的目标日期
TARGET_DATE="20180322"
# 用数组存储所有匹配的文件(支持带空格的文件名)
MATCHED_FILES=(/tmp/dir/*_"${TARGET_DATE}"_*)

# 检查数组长度,大于0说明有文件存在
if [ ${#MATCHED_FILES[@]} -gt 0 ]; then
    # 执行打包,数组会自动处理特殊字符文件名
    tar -czf "${TARGET_DATE}.tar.gz" "${MATCHED_FILES[@]}"
    echo "成功打包 ${#MATCHED_FILES[@]} 个${TARGET_DATE}相关文件"
else
    echo "未找到${TARGET_DATE}相关文件,跳过tar包生成"
fi

# 可选:关闭nullglob,恢复Shell默认行为(防止影响后续命令)
shopt -u nullglob

方法2:用find命令查找文件(适合复杂路径/额外过滤需求)

如果你的文件路径层级多,或者需要额外过滤(比如只打包普通文件),用find会更灵活:

TARGET_DATE="20180322"
TARGET_DIR="/tmp/dir"

# 先检查是否存在匹配文件
if find "${TARGET_DIR}" -maxdepth 1 -type f -name "*_${TARGET_DATE}_*" | grep -q .; then
    # 用-print0和xargs -0处理带空格的文件名,避免出错
    find "${TARGET_DIR}" -maxdepth 1 -type f -name "*_${TARGET_DATE}_*" -print0 | xargs -0 tar -czf "${TARGET_DATE}.tar.gz"
    echo "${TARGET_DATE}相关文件打包完成"
else
    echo "未找到${TARGET_DATE}相关文件,不生成tar包"
fi

为什么直接用tar会出问题?

当你执行tar -czf 20180319.tar.gz /tmp/dir/*20180319*时,如果没有匹配的文件,Shell不会替换通配符,而是把/tmp/dir/*20180319*当作一个字面文件名传给tar。tar找不到这个文件就会报错,同时因为tar默认会创建输出文件(哪怕没添加任何内容),所以就生成了空包。

上面的两种方法都先做了存在性检查,从根源避免了空包和不必要的报错。

内容的提问来源于stack exchange,提问作者are

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:15:17