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

Shell脚本压缩文件/目录问题:输出文件名异常及功能完善

解决Shell压缩脚本的文件名缺失及功能完善问题

看起来你的脚本遇到了两个核心问题:一是生成的压缩文件名丢失了原文件/目录的名称,二是缺少对已存在输出文件的警告处理。咱们一步步修复并完善这个脚本:

问题根源分析

  1. 语法错误导致参数判断失效:
    你的第一个条件判断if ["$1" == ""];存在语法bug——[是test命令的别名,它和后面的参数之间必须有空格,否则Shell会把["$1"当成一个不存在的命令,直接跳过这个判断分支。如果用户忘记传参数,脚本会直接执行tar命令,此时$1为空,就会生成_日期.tar.bz2这种错误文件名。

  2. 缺少输出文件存在性检查:
    原脚本没有判断目标压缩文件是否已经存在,默认情况下tar会直接覆盖文件,这很容易误删重要数据,咱们需要添加检查并给出友好警告。

  3. 变量引用未加引号:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:46:24