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

使用zip或tar压缩当前目录时路径冗余及匹配报错如何解决

问题修复方案

错误原因分析

  • zip warning: name not matched: $PWD/*报错的核心原因是你将通配符*放在了双引号内部,Bash不会对双引号内的通配符做路径展开,导致zip将*当成了真实文件名去匹配,自然找不到对应文件。
  • 压缩包保留完整顶层路径的问题是因为你已经cd进入了$Sub_Dir,但压缩时还是传入了绝对路径$PWD作为参数,压缩工具会默认保留传入路径的完整结构。

修正后的代码实现

# 先校验目标目录是否存在,避免cd失败导致后续逻辑异常
if [ ! -d "$Sub_Dir" ]; then
  echo "错误:目标目录 $Sub_Dir 不存在"
  exit 1
fi

# 使用子shell包裹cd操作,结束后自动回到原工作目录,不需要手动执行cd返回
(
  cd "$Sub_Dir" || exit 1
  Zipped_Files=$(basename "$Sub_Dir")
  # 仅压缩当前目录下所有内容,保留子目录结构,不会携带外层绝对路径
  zip -r "${Zipped_Files}.zip" ./*
  # 如果要使用tar压缩,替换成下面这行即可,压缩包内结构和目标目录内结构完全一致
  # tar -zcf "${Zipped_Files}.tar.gz" ./*
  # 如果需要把压缩包生成到原工作目录而非当前Sub_Dir内,把路径改成 ../${Zipped_Files}.zip 即可
)

echo "Files have been compressed"

补充说明

  • 如果你不需要保留任何目录结构,只把所有文件平铺在压缩包根目录,将zip的-r参数替换为-j即可。
  • 用子shell包裹cd操作是Bash脚本的常用最佳实践,避免脚本后续操作的工作目录被意外修改。
  • 如果目标目录内有.开头的隐藏文件需要一起压缩,将./*替换为.即可,这样会包含当前目录下所有内容包括隐藏文件,同时压缩包根目录不会额外多一层目录。
  • tar命令生成的是gzip压缩的tar归档,建议后缀使用.tar.gz而非.zip,避免文件格式和后缀不匹配的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:54:01