рекурсивно сжимать все 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 
  • Почему «набор» не работает для меня, а «объявляет»?
  • Передача glob-выражений в функции / скрипты
  • Как найти все файлы с файлом формата Heena_Report_MMDDYYY.CSV через команду Unix с даты марта 2016 года до даты?
  • Чтобы получить журналы между конкретными метками времени вместе с датой, используя сценарий оболочки
  • Разделение большого дерева каталогов по типу файла
  • Последовательность Шебанга в скрипте
  • Понимание переменных окружающей среды в разных контекстах
  • Как заменить bash на Python?
  • Shell Script для вставки строк между файлами
  • Есть расширение оболочки, которое похоже на scm_breeze, где вывод нумеруется, и вы можете псевдонизировать файл по его номеру
  • Сортировка ls по времени, когда слишком много файлов для одного вызова
  • Linux и Unix - лучшая ОС в мире.