我对 Linux 脚本还比较陌生,当我尝试使用一个脚本时,发现目录名或文件名中有空格,因此出现了问题。该脚本会缩小 PDF 文件,以便我可以将它们放入电子邮件中。
gs -q -dNOPAUSE -dBATCH -dSAFER \
-sDEVICE=pdfwrite \
-dCompatibilityLevel=1.3 \
-dPDFSETTINGS=/screen \
-dEmbedAllFonts=true \
-dSubsetFonts=true \
-dColorImageDownsampleType=/Bicubic \
-dColorImageResolution=72 \
-dGrayImageDownsampleType=/Bicubic \
-dGrayImageResolution=72 \
-dMonoImageDownsampleType=/Bicubic \
-dMonoImageResolution=72 \
-sOutputFile=Compressed$1 \
"$1"
所以我使用命令
find * -type f -name "*.pdf" -exec sudo sh ~/shrinkpdf.sh {} \;
它将对同一文件夹中没有空格的 PDF 起作用,但是当它尝试访问其中包含空格的文件夹时,它会出现错误并仅使用文件夹名称的第一个单词创建一个文件。
我如何才能让它接受名称中带有空格的文件和文件夹?
感谢 Shell 脚本挑战用户
答案1
您引用了其中一个 $1 ,但没有引用另一个。如果您的路径包含空格,则引用是必不可少的。为了安全起见,最好假设脚本收到的每个路径都包含有问题的字符,并引用每个路径。
这是我的建议:
gs -q -dNOPAUSE -dBATCH -dSAFER \
-sDEVICE=pdfwrite \
-dCompatibilityLevel=1.3 \
-dPDFSETTINGS=/screen \
-dEmbedAllFonts=true \
-dSubsetFonts=true \
-dColorImageDownsampleType=/Bicubic \
-dColorImageResolution=72 \
-dGrayImageDownsampleType=/Bicubic \
-dGrayImageResolution=72 \
-dMonoImageDownsampleType=/Bicubic \
-dMonoImageResolution=72 \
"-sOutputFile=Compressed$1" \
"$1"
如果你感到疑惑,那么像这样引用选项是可以的;它与引用其他类型的参数没有什么不同。gs -q
并且gs "-q"
当 gs 收到它们时,它们看起来与 gs 完全相同。
我们只是在这里使用它们来确保整个路径成为选项的一部分-sOutputFile
,而不是以前的情况:空格之前的片段被正确分配给选项参数,而空格之后的片段是一个独立的参数,可能gs
已经被视为输入文件参数。