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

