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
相关产品推荐
相关产品推荐

