Shell脚本压缩文件/目录问题:输出文件名异常及功能完善
解决Shell压缩脚本的文件名缺失及功能完善问题
看起来你的脚本遇到了两个核心问题:一是生成的压缩文件名丢失了原文件/目录的名称,二是缺少对已存在输出文件的警告处理。咱们一步步修复并完善这个脚本:
问题根源分析
语法错误导致参数判断失效:
你的第一个条件判断if ["$1" == ""];存在语法bug——[是test命令的别名,它和后面的参数之间必须有空格,否则Shell会把["$1"当成一个不存在的命令,直接跳过这个判断分支。如果用户忘记传参数,脚本会直接执行tar命令,此时$1为空,就会生成_日期.tar.bz2这种错误文件名。缺少输出文件存在性检查:
原脚本没有判断目标压缩文件是否已经存在,默认情况下tar会直接覆盖文件,这很容易误删重要数据,咱们需要添加检查并给出友好警告。变量引用未加引号:
tar命令里的输出文件名拼接$1"_"$(date...)没有加引号,如果原路径包含空格或特殊字符,会导致文件名被拆分,出现意外错误。
修复并完善后的脚本
#!/bin/bash # 检查是否传入参数 if [ -z "$1" ]; then echo "帮助信息:请传入待压缩的文件或目录路径作为参数" echo "示例:./cmp.sh /home/user" exit 1 fi # 检查目标路径是否存在 if [[ ! -f "$1" && ! -d "$1" ]]; then echo "错误:路径 '$1' 不存在,请检查输入" exit 1 fi # 生成输出文件名:原路径+当前日期(年-月-日)+.tar.bz2 # 完全匹配你示例的格式:输入/home/user → 输出/home/user_2018-03-11.tar.bz2 output_file="${1}_$(date '+%Y-%m-%d').tar.bz2" # 检查输出文件是否已存在 if [ -f "$output_file" ]; then echo "警告:输出文件 '$output_file' 已存在,不会执行压缩操作" exit 0 fi # 执行压缩操作 echo "正在压缩 '$1' 到 '$output_file'..." tar -cvjSf "$output_file" "$1" # 反馈压缩结果 if [ $? -eq 0 ]; then echo "压缩完成!" else echo "压缩失败,请检查错误信息" exit 1 fi
关键修复点说明
- 参数判断修复:用
[ -z "$1" ]替代错误的["$1" == ""],-z是Shell中专门判断字符串是否为空的语法,简洁且可靠,同时严格保证[和参数之间的空格。 - 输出文件名生成:用
${1}_$(date '+%Y-%m-%d').tar.bz2拼接路径,完全匹配你要求的“原名称+当前日期”格式,其中%Y-%m-%d生成四位年份-两位月份-两位日期的格式(和你示例的2018-03-11一致)。 - 存在性检查:添加了两层检查——先确认待压缩的路径是否存在,再检查输出文件是否已存在,避免无效操作和文件覆盖。
- 引号包裹变量:所有变量引用都用双引号包裹,确保路径含空格或特殊字符时不会出错。
- 结果反馈:添加了压缩过程提示和成功/失败的反馈,让用户清晰知道操作状态。
使用示例
执行./cmp.sh /home/user,如果/home/user_2018-03-11.tar.bz2不存在,会正常生成该压缩文件;如果文件已存在,会输出警告信息并终止操作,不会覆盖原文件。
内容的提问来源于stack exchange,提问作者Davin Dirgantara
相关产品推荐
相关产品推荐

