使用zip命令压缩文件时路径名含撇号的报错问题咨询
问题原因
这不是zip工具本身不支持带撇号的路径,也不是你操作存在疏漏,核心问题出在-T/--test校验参数的内部实现逻辑:
你手动输入命令时加的引号、转义符只会被当前的shell解析,最终可以正确把路径传递给zip进程。但zip执行-T校验步骤时,会内部构造unzip -t 目标压缩包路径的命令,直接传递给sh执行,构造命令的过程中没有对路径里的单引号、括号等特殊字符做转义处理,就会触发sh的语法报错。
可行解决方案
方案1:拆分压缩与校验步骤(兼容性最好,推荐)
不要用zip自带的-T参数,手动拆分执行压缩和校验逻辑,自己控制路径的转义规则即可。
命令行场景执行示例:
# 先执行压缩,不加-T参数 zip -rm "./I've Been Everywhere (Today)/PDFs.zip" "./PDFDirectory" # 手动执行校验,路径用双引号包裹即可正常解析 unzip -t "./I've Been Everywhere (Today)/PDFs.zip"
如果是在脚本中使用,可以加校验结果判断,自动处理失败场景:
ZIP_PATH="./I've Been Everywhere (Today)/PDFs.zip" # 执行压缩 zip -rm "$ZIP_PATH" "./PDFDirectory" # 校验压缩包有效性 if unzip -t "$ZIP_PATH"; then echo "压缩包校验通过" else echo "压缩包校验失败,已删除无效文件" rm -f "$ZIP_PATH" exit 1 fi
方案2:指定unzip命令模板(适合坚持用-T参数的场景)
可以通过zip的--unzip-command参数手动指定校验用的命令模板,让内部调用时正确转义路径:
zip -rmT --unzip-command 'unzip -t %q' "./I've Been Everywhere (Today)/PDFs.zip" "./PDFDirectory"
其中%q是zip提供的占位符,会自动把路径转义为shell安全的格式。
内容的提问来源于stack exchange,提问作者Steven Johns
相关产品推荐
相关产品推荐

