Shell脚本压缩时去除完整路径,仅保留data目录结构
问题解决与脚本修改
核心问题原因
你当前的脚本使用绝对路径作为zip命令的输入参数,导致压缩包中包含了完整的系统路径(/root/Archive/EKS/data/xxx),因此解压时会重建整个路径层级,出现路径重复的问题。
针对需求的修改方案
根据你“压缩整个data目录,压缩包保存在data目录下”的需求,修改后的脚本如下:
# 定义目标目录路径 target_dir="/root/Archive/EKS/data" # 切换到data目录的上级目录(/root/Archive/EKS),切换失败则终止脚本 cd "$(dirname "$target_dir")" || exit 1 # 递归压缩data目录,将压缩包保存到data目录下 zip -r "./data/data.zip" "data"
如果你的实际需求是压缩data目录下的每个子目录(每个子目录单独生成zip包),则使用以下脚本:
startdir="/root/Archive/EKS/data" # 切换到data目录,切换失败则终止脚本 cd "$startdir" || exit 1 # 遍历data目录下的所有子目录 for sub_dir in */ ; do # 递归压缩子目录,生成与子目录同名的zip包(如子目录test生成test.zip) zip -r "${sub_dir%/}.zip" "$sub_dir" done
关键修改点说明
- 切换工作目录:通过
cd命令切换到目标目录的上级(或目标目录本身),让zip命令使用相对路径处理文件/目录,避免打包绝对路径。 - 递归压缩参数
-r:原脚本未添加-r,会仅压缩目录本身而不包含内部文件,添加-r才能递归压缩目录内所有内容。 - 错误处理:
|| exit 1确保在目录切换失败时终止脚本,防止后续执行错误操作。
验证效果
修改后生成的压缩包,解压后只会得到data目录(或对应子目录)及其内部的文件结构,不会出现/root/Archive/EKS/data这样的完整路径层级。
内容的提问来源于stack exchange,提问作者Gowmi
相关产品推荐
相关产品推荐

