使用 shell 脚本但目录或名称上有空格导致失败

使用 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"

所以我使用命令

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已经被视为输入文件参数。

相关内容