рекурсивно сжимать все pdf-файлы

Я хочу сжать все мои pdf-файлы в данном каталоге и его подкаталогах с помощью ghostscript.

Я застрял, используя команду find в циклах по имени файла, включая пробелы.

Вот пример кода, на который я нацелен:

 pdffiles=$(find /path/to/directory -type f -name *.pdf) for file in pdffiles; do gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH -dQUIET -sOutputFile=new_$file $file; rm $file; mv new_$file $file; done; 

Любая идея, как я могу решить проблему с пробелами? Есть лучший способ сделать это?

2 Solutions collect form web for “рекурсивно сжимать все pdf-файлы”

Ваша петля лучше написана как

 find ... | while read -r file 

Но тогда вам нужно убедиться, что вы указываете имя файла внутри цикла. Таким образом, мы получаем

 find /path/to/directory -type f -name *.pdf | while read -r file do gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH -dQUIET -sOutputFile="new_$file" "$file" rm "$file" mv "new_$file" "$file" done 

(Также обратите внимание на все это: не нужно).

Теперь этот цикл имеет потенциальные права на владение / разрешение файлов, но это еще один вопрос 🙂

спасибо за ваши замечательные ответы! Я реорганизовал свой сценарий, и он работает неплохо 🙂

Вот отредактированный, улучшенный код с протоколированием, параметрами и некоторыми другими материалами. Я всегда открыт для улучшения моего кода. Заранее спасибо.

  #!/bin/bash ## Script to compress PDF Files using ghostscript incl. subdirs ## Copyright (C) 2016 Maximilian Fries - All Rights Reserved ## Contact: maxfries@t-online.de ## Last revised 2016-07-29 # Usage # ./pdf-compress.sh [screen|ebook|prepress|default] [verbose] # Variables and preparation { count=0 success=0 successlog=./success.tmp gain=0 gainlog=./gain.tmp pdfs=$(find ./ -type f -name "*.pdf") total=$(echo "$pdfs" | wc -l) log=./log verbose="-dQUIET" mode="prepress" echo "0" | tee $successlog $gainlog > /dev/null } # Are there any PDFs? if [ "$total" -gt 0 ]; then #Parameter Handling & Logging { echo "-- Debugging for Log START --" echo "Number of Parameters: $#" echo "Parameters are: $*" echo "-- Debugging for Log END --" } >> $log # Only compression-mode set if [ $# -eq 1 ]; then mode="$1" fi # Also Verbose Level Set if [ $# -eq 2 ]; then mode="$1" verbose="" fi echo "$pdfs" | while read -r file do ((count++)) echo "Processing File #$count of $total Files" | tee -a $log echo "Current File: $file "| tee -a $log gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS="/$mode" -dNOPAUSE \ -dBATCH $verbose -sOutputFile="$file-new" "$file" | tee -a $log sizeold=$(wc -c "$file" | cut -d' ' -f1) sizenew=$(wc -c "$file-new" | cut -d' ' -f1) difference=$((sizenew-sizeold)) # Check if new filesize is smaller if [ $difference -lt 0 ] then rm "$file" mv "$file-new" "$file" printf "Compression was successfull. New File is %'.f Bytes smaller\n" \ $((-difference)) | tee -a $log ((success++)) echo $success > $successlog ((gain-=difference)) echo $gain > $gainlog else rm "$file-new" echo "Compression was not necessary" | tee -a $log fi done # Print Statistics printf "Successfully compressed %'.f of %'.f files\n" $(cat $successlog) $total | tee -a $log printf "Safed a total of %'.f Bytes\n" $(cat $gainlog) | tee -a $log rm $successlog $gainlog else echo "No PDF File in Directory" fi 
  • Каково значение $ {# 1}?
  • Использование sed для преобразования строк в строки
  • Результат echo * и echo. *
  • Значение Umask не отражается после внесения изменений
  • Передача glob-выражений в функции / скрипты
  • Должен ли я добавить «> & 2» в конце команды echo?
  • Опция gnome - terminal -e не выполняется?
  • Зачем прикасаться к созданию файла в / tmp, если максимальный размер файла ограничен нулевыми байтами?
  • Как включить программу, которая работает только с файлами in / out в конвейер?
  • Эволюция оболочки
  • Невозможно использовать переменную окружения Array
  • Interesting Posts

    После настройки виртуальных хостов Apache не будет перезагружаться

    Невозможно установить или загрузить что-либо в груше 8

    Где хранить общие данные в FHS 3.0?

    Звук HDMI не работает на archlinux с pulseaudio

    Несколько проходов очищающего диска с `dd`

    acpi_listen: невозможно открыть сокет /var/run/acpid.socket: нет такого файла или каталога

    Должен ли rpc.statd писать что-нибудь в wtmp?

    Как скрыть исходные точки монтирования с монтированием привязки?

    Крошечный и простой скрипт терпит неудачу, и это результат «Нет такого файла или каталога»,

    Есть ли способ найти исправления, требующие тестирования из пакетов, которые у вас есть?

    Regex in find – OS X

    Почему большинство дистрибутивов сети UEFI и grub?

    Какие компоненты отсутствуют, сравнивая серверную версию linux distro с настольной версией? Разве это только DE отсутствует?

    найти «выражение» в каждом файле каталога рекурсивно

    Написание сценария завершения вкладки для bash

    Linux и Unix - лучшая ОС в мире.