使用 shell 脚本,但由于目录或名称上有空格而失败

4 linux script shell

我对 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 的​​用户,

kam*_*mpu 6

您引用的是 $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 -qgs "-q"看起来与 gs 完全相同。

我们只是在这里使用它们来确保整个路径成为-sOutputFile选项的一部分,而不是以前的情况:空格之前的片段被正确分配给选项参数,而空格之后的片段是一个独立的参数,这很gs可能被视为输入文件参数。