我对 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"
Run Code Online (Sandbox Code Playgroud)
所以我使用命令
find * -type f -name "*.pdf" -exec sudo sh ~/shrinkpdf.sh {} \;
Run Code Online (Sandbox Code Playgroud)
它将在没有空格的同一文件夹中处理 PDF,但是当它尝试访问其中有空格的文件夹时,它会出错并仅使用文件夹名称的第一个单词创建一个文件。
我怎样才能让它接受名称中带有空格的文件和文件夹?
感谢 Shell Script Challenged 的用户,
您引用的是 $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"
Run Code Online (Sandbox Code Playgroud)
如果您想知道,可以引用这样的选项;这与引用其他类型的论点没有什么不同。当 gs 收到它们时gs -q ,gs "-q"看起来与 gs 完全相同。
我们只是在这里使用它们来确保整个路径成为-sOutputFile选项的一部分,而不是以前的情况:空格之前的片段被正确分配给选项参数,而空格之后的片段是一个独立的参数,这很gs可能被视为输入文件参数。