LINUX.ORG.RU

Bash скрипт, конвертор


0

0
#!/bin/bash

echo -e "\x1b[32mStarting process\x1b[0m"

dir=/raid/fs/

contracts="$dir"contracts/*/*/*
attachments="$dir"attachments/*/*/*
scandocs="$dir"scandocs/*/*

for i in `ls -1R $contracts $attachments $scandocs`
  do
    if [ -f "$i" ] && [ ${i/_thumb/} = ${i} ]
      then
        imageType=`file $i | awk '{ print $2; }'`
        imageDir=`dirname $i`
        imageWithoutExt=`echo $i | awk -F. '{ print $1; }'`
        imageExt=`echo $i | awk -F. '{ print $2;  }'`

        case $imageType in
          # Работа над JPEG, GIF, PNG форматами
          JPEG | GIF | PNG)
            if [ ! -f "$imageWithoutExt".tif  ]
              then
                echo Start converting "$i" to TIFF image type
                convert "$i"  "$imageWithoutExt".tif
            fi

            echo Removing file "$i"
            rm -f "$i" ;;
        esac

        # Действия общие для всех изображений
        # Создание thumbnail'a
        if [ ! -f "$imageWithoutExt"_thumb.png  ]
          then
            echo Start converting thumbnail for "$i"
              convert "$imageWithoutExt".tif -resize 128 -quality 100 "$imageWithoutExt"_thumb.png
        fi

        # Создание PDF из TIFF'a
        if [ ! -f "$imageWithoutExt".pdf ]
          then
            echo Start converting imgae "$i" to PDF
            tiff2pdf "$imageWithoutExt".tif -o "$imageWithoutExt".pdf
        fi

      fi
  done

echo -e "\x1b[32mProccess finished\x1b[0m"

Скрипт пробегает рекурсивно по указанным директориям и если встречает файл–картинку не TIF, то конвертит её в TIF. Затем, создаёт PNG­­­-привью. После ещё из TIF'ов генерит PDF.

Работает медленно, грешу на утилиту convert. Кто ещё что подскажет, как ускорить процесс?

★★★
for i in `ls -1R $contracts $attachments $scandocs` 
  do 
    if [ -f "$i" ] && [ ${i/_thumb/} = ${i} ] 

Вот здесь у тебя множество мусора (права, дата, прочее) проходят проверку на существование файла дважды. Зачем оно надо? Предлагаю создавать входящий список конвейером find | sed | sort.

Alan_Steel ★★
()
Ответ на: комментарий от Alan_Steel

ls -1R

В таком виде ls отдаёт тупо список, без лишнего мусора.

VirRaa ★★★
() автор топика

convert действительно не очень быстрый. А зачем писать свой find, если есть готовый?

thumb()
{
....
}

if test "x$1" != "x"; then
    thumb "$1"
else
    find . \! -type d -exec sh -c "$0" {} \;
fi
rymis ★★
()

> Работает медленно, грешу на утилиту convert. Кто ещё что подскажет, как ускорить процесс?

запускать несколько convert в фоне.

p.s. у куда тут торопиться ? подобные скрипты всё-одно работают как правило ночью по крону.

MKuznetsov ★★★★★
()

VirRaa> как ускорить процесс?

По-сравнению с convert, все остальное мелочь.

Запусти параллельно 3 экземпляра скрипта, по одному для $contracts $attachments $scandocs соответственно.

sdio ★★★★★
()

bash с версии 4 поддерживает рекурсивный глоббинг (да, да та самая крутая фича zsh,которая так упрощает нам жизнь), соответственно ваш цикл можно существенно упростить, использование ls в циклах это моветон:

for i in /raid/fs/{contracts,attachments,scandocs}/**/*.{jpg,gif,png}
do

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

nice -n 15 convert&

zolden ★★★★★
()

И кстати, как вы думаете в каком формате файл image.tif.jpg или image.jpg.txt ?

Полагаю вместо $2 в таком случае правильнее использовать $NF, но совсем уж по хорошему формат файла надо определять более низкоуровнево, а то мало ли...

zolden ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.