Bash 脚本在压缩文件时不允许使用特殊符号

Bash Script Not allowing special symbols in zipping a file

我实际上是根据我通过java代码下载的pdf文件创建一个zip文件,所以问题陈述是这样的。

我有一个带有特殊符号的 pdf 文件 = (wallbay)+1-50 m+ ipad+i pho ne%watch.pdf

现在我希望将此文件创建为 zip 文件,其名称应为 (wallbay\)+1-50m+ipad+iphone%watch.pdf.zip

我尝试了以下命令:

cd /Users/rkr5/Downloads/admin && zip --symlinks -r \(wallbay\)+1-50m+ipad+iphone%watch.pdf.zip   \(wallbay)+1-50 m+ ipad+i pho ne%watch.pdf
                        
cd /Users/rkr5/Downloads/admin && zip --symlinks -r "\(wallbay)+1-50 m+ ipad+i pho ne%watch.pdf.zip"   "\(wallbay)+1-50 m+ ipad+i pho ne%watch.pdf"
                        
cd /Users/rkr5/Downloads/admin && zip --symlinks -r \(wallbay)+1-50 m+ ipad+i pho ne%watch.pdf.zip   "\(wallbay)+1-50 m+ ipad+i pho ne%watch.pdf"

None 他们正在工作并抛出像 "parse error near ``)'"

这样的错误

唯一有效的命令是

cd /Users/rkr5/Downloads/admin && zip --symlinks -r \(wallbay\)+1-50m+ipad+iphone%watch.pdf.zip    \(wallbay\)+1-50m+ipad+iphone%watch.pdf

但以上命令仅在 pdf 文件名中没有空格时有效。

目前我的文件夹结构是

/Users/rkr5/Downloads/admin/(wallbay)+1-50m+ipad+iphone%watch.pdf.zip
/Users/rkr5/Downloads/admin/(wallbay)+1-50 m+ ipad+i pho ne%watch.pdf

我目前正在使用 MacOs..

由于文件名包含由 shell(如 ())或白色 space 解释的字符,您需要转义或引用它们。

我建议引用:它更容易,并且只需要用双引号将 未修改的 文件名括起来(") 如下:

cd /Users/rkr5/Downloads/admin && zip --symlinks -r "(wallbay)+1-50 m+ ipad+i pho ne%watch.pdf.zip" "(wallbay)+1-50 m+ ipad+i pho ne%watch.pdf"

如果您愿意,可以使用 shell 变量来避免重复文件名两次:

filename="(wallbay)+1-50 m+ ipad+i pho ne%watch.pdf"
cd /Users/rkr5/Downloads/admin && zip --symlinks -r "$filename.zip" "$filename"

(因为您只压缩一个文件,所以选项 -r 不是必需的。)

为什么你的命令不起作用?

这条命令:

cd /Users/rkr5/Downloads/admin && zip --symlinks -r \(wallbay\)+1-50m+ipad+iphone%watch.pdf.zip   \(wallbay)+1-50 m+ ipad+i pho ne%watch.pdf

不起作用,因为白色 space 和 PDF 文件名中的第二个括号未转义。

这条命令:

cd /Users/rkr5/Downloads/admin && zip --symlinks -r "\(wallbay)+1-50 m+ ipad+i pho ne%watch.pdf.zip"   "\(wallbay)+1-50 m+ ipad+i pho ne%watch.pdf"

不起作用,因为它被 both 引用 and (部分)转义。

这条命令:

cd /Users/rkr5/Downloads/admin && zip --symlinks -r \(wallbay)+1-50 m+ ipad+i pho ne%watch.pdf.zip   "\(wallbay)+1-50 m+ ipad+i pho ne%watch.pdf"

不起作用,因为它被 both 引用 and (部分)转义,并且末尾缺少双引号zip 存档的名称。