4

Я относительно новичок в скрипте 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 Script Challenged,

1 ответ1

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"

Если вам интересно, хорошо бы процитировать такие варианты; это ничем не отличается от цитирования других аргументов. gs -q и gs "-q" выглядят точно так же, как и gs, когда gs их получает.

Мы просто используем их здесь, чтобы убедиться, что весь путь сделан частью опции -sOutputFile , а не так, как это было раньше: фрагмент перед пробелом был правильно назначен аргументу опции, а фрагмент после пробела был независимым аргумент, что gs вполне может рассматриваться как аргумент входного файла.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .