Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Пакетная обработка фоток  (Прочитано 256 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн vnsmirnv

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Пакетная обработка фоток
« : 21 Апрель 2017, 21:01:09 »
Задача: переконвертировать домашнюю коллекцию фото. Фотографии хранятся в директории Год плюс множество поддиректорий. Наваял вот такой скрипт
#!/bin/bash
echo " "
echo  "--==Конвертируем==--"
echo " "
mkdir /media/***/0F6C14C70F6C14C7/test
 SOURCE=/media/***/0F6C14C70F6C14C7/2010
 TARGET=/media/***/0F6C14C70F6C14C7/test
for i in `find $SOURCE -type f -iname "*.jpg" -or -iname "*.jpeg" -or -iname "*.JPG" -or -iname "*.JPEG" -or -iname "* *.jpg" -or -iname "* *.JPG" -or -iname "* *.JPEG"`
do
  echo "Working on $i ..."
  convert "$i" -resize 1024 -quality 90 $TARGET/$i ;
 done
echo " "
echo "... Done!"
echo " "
exit 0
но он выдает ошибку convert: unable to open image * Нет такого файла или каталога @ error/blob.c/OpenBlob/2712.
Т.е. не может записать файл output в созданную директорию.

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 4576
  • elementaryOS 0.4 Loki, Crunch(Bunsenlabs)
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #1 : 21 Апрель 2017, 21:24:25 »
Код: Bash
  1. while read i ; do
  2. done < <(find "$SOURCE" -iregex '.*\.jpe?g')
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн vnsmirnv

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #2 : 21 Апрель 2017, 22:04:05 »
Код: Bash
  1. while read i ; do
  2. done < <(find "$SOURCE" -iregex '.*\.jpe?g')
Эмм, не пойму как это все должно стоять в скрипте(((
Если так
Код: Bash
  1. find "$SOURCE" -iregex '.*\.jpe?g' | while read i; do
  2.   echo "Working on $i ..."
  3.   convert "$i" -resize 1024 -quality 90 $TARGET/$i ;
  4.  done
  5. echo " "
  6. echo "... Done!"
  7. echo " "
  8. exit 0

то тоже самое
« Последнее редактирование: 21 Апрель 2017, 22:26:27 от vnsmirnv »

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 4576
  • elementaryOS 0.4 Loki, Crunch(Bunsenlabs)
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #3 : 21 Апрель 2017, 23:13:05 »
Код: Bash
  1. while read i ; do
  2.     echo "Working on $i ..."
  3.     convert "$i" -resize 1024 -quality 90 "$TARGET/$i"
  4. done < <(find "$SOURCE" -iregex '.*\.jpe?g')
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн vnsmirnv

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #4 : 22 Апрель 2017, 14:57:11 »
done < <(find "$SOURCE" -iregex '.*\.jpe?g')
В таком варианте
Код: Bash
  1. find $SOURCE -type f -iname "*.jpg" -or -iname "*.jpeg" -or -iname "*.JPG" -or -iname "*.JPEG" -or -iname "* *.jpg" -or -iname "* *.JPG" -or -iname "* *.JPEG" ;
  2.     while read i ; do
  3.         echo "Working on $i ..."
  4.         convert "$i" -resize 1024 -quality 90 "$TARGET/$i"
  5.     done < <(find "$SOURCE" -iregex '.*\.jpe?g')
выдает ошибку Syntax error: redirection unexpected

Оффлайн renzrv

  • Активист
  • *
  • Сообщений: 940
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #5 : 22 Апрель 2017, 15:07:48 »
Код: Bash
  1. find "$SOURCE" -iregex '.*\.jpe?g' \
  2. | while read i
  3. do
  4.     echo "Working on $i ..."
  5.     convert "$i" -resize 1024 -quality 90 "${TARGET}/${i}"
  6. done
  7.  

Оффлайн vnsmirnv

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #6 : 22 Апрель 2017, 15:12:20 »
renzrv,
 В этом случае опять изначальная ошибка Нет такого файла или каталога @ error/blob.c/OpenBlob/2712

Оффлайн renzrv

  • Активист
  • *
  • Сообщений: 940
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #7 : 22 Апрель 2017, 15:22:04 »
Имя файла в Working on какое?
В find после "$SOURCE" добавь: -type f

Оффлайн vnsmirnv

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #8 : 22 Апрель 2017, 15:28:39 »
Имя файла в Working on какое?
в основном IMG_1234.JPG, но есть и русские имена. -type f добавлял ничего не меняет. Фактически если этотже скрипт запустить в дирректории без поддиректорий, то он работает,

Оффлайн renzrv

  • Активист
  • *
  • Сообщений: 940
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #9 : 22 Апрель 2017, 15:36:31 »
"${TARGET}/${i}" - здесь ошибка.

Код: Bash
  1. find "$SOURCE" -type f -iregex '.*\.jpe?g' \
  2. | while read i
  3. do
  4.     echo "Working on $i ..."
  5.     convert "$i" -resize 1024 -quality 90 "${TARGET}/${i##*/}"
  6. done

Оффлайн vnsmirnv

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #10 : 22 Апрель 2017, 15:42:09 »
"${TARGET}/${i}" - здесь ошибка
Я знаю (в первом посте ее и обозначил), но не мог ее победить. Спасибо огромное :coolsmiley:

Оффлайн renzrv

  • Активист
  • *
  • Сообщений: 940
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #11 : 22 Апрель 2017, 15:57:40 »
Вот вариант покруче (с созданием поддиректорий картинок из SOURCE в TARGET):
Код: Bash
  1. find "$SOURCE" -type f -iregex '.*\.jpe?g' \
  2. | while read i
  3. do
  4.     echo "Working on $i ..."
  5.     idir="${i%/*}"
  6.     itargetdir="${TARGET}${idir#$SOURCE}"
  7.     mkdir -p "$itargetdir"
  8.     convert "$i" -resize 1024 -quality 90 "${itargetdir}/${i##*/}"
  9. done

Оффлайн vnsmirnv

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #12 : 22 Апрель 2017, 17:55:12 »
Вот вариант покруче (с созданием поддиректорий картинок из SOURCE в TARGET):
Действительно обалденный вариант!!!
Вот что у меня в итоге вышло
Код: Bash
  1. #!/bin/bash
  2. # Скрипт конвертирует все файлы .jpe?g в папке и поддиректориях
  3. echo " "
  4. echo  "--==Конвертируем==--"
  5. echo " "
  6.  SOURCE=/home/         # Папка источник
  7.  TARGET=/home/     # Папка назначения
  8. mkdir $TARGET
  9.     find "$SOURCE" -type f -iregex '.*\.jpe?g' \
  10.     | while read i
  11.     do
  12.         echo "Working on $i ..."
  13.         idir="${i%/*}"
  14.         itargetdir="${TARGET}${idir#$SOURCE}"
  15.         mkdir -p "$itargetdir"
  16.         convert "$i" -resize 1024 -quality 90 "${itargetdir}/${i##*/}"
  17.     done
  18. echo "... Done!"
  19. echo " "
  20. exit 0
Ну и дополнительно можно прогнать еще этим скриптом, с помощью которого вернем дату создания снимков
Код: Bash
  1. #!/bin/bash
  2. # возвращаем дату создания из EXIF
  3. # Будут обработаны все файлы .jpg в текущей директории (откуда запущен скрипт) и в поддиректориях
  4. echo " "
  5. echo  "--==Конвертируем==--"
  6. echo " "
  7. SOURCE=/home  # Источник
  8.  
  9.     find "$SOURCE" -type f -iregex '.*\.jpe?g' \
  10.     | while read i
  11.     do
  12. # Чтоб знать, что не зависло
  13. echo "$i"
  14.  exiv2 \
  15.  -Tk mv "$i" "$i"
  16.  
  17. done

Оффлайн renzrv

  • Активист
  • *
  • Сообщений: 940
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #13 : 22 Апрель 2017, 19:03:54 »
Скрипт лучше оформить так:
#!/bin/bash

case "$1" in
""|-h|-help|--help)
echo '
ИСПОЛЬЗОВАНИЕ:
'$0' ДИРЕКТОРИЯ

ОПИСАНИЕ:
Скрипт конвертирует файлы картинок из текущей директории (ИСТОЧНИК)
в директорию указанную в первом аргументе скрипта (НАЗНАЧЕНИЕ).

Конвертируются все файлы картинок из директории ИСТОЧНИК
и всех ее поддиректорий.
Шаблон имен файлов картинок: ".jpe?g"

В директории НАЗНАЧЕНИЕ создаются все поддиректории
из директории ИСТОЧНИК содержащих файлы картинок.
'
exit
;;
esac

SOURCE_DIR="$PWD"
TARGET_DIR="$1"
[ -d "$TARGET_DIR" ] || { echo 'Ошибка: Директория НАЗНАЧЕНИЕ не найдена.' ; exit 1 ; }

find "$SOURCE_DIR" -type f -iregex '.*\.jpe?g' \
| while read i
do
    echo "Обрабатывается $i ..."
    idir="${i%/*}"
    itargetdir="${TARGET_DIR}${idir#$SOURCE_DIR}"
    mkdir -p "$itargetdir"
    convert "$i" -resize 1024 -quality 90 "${itargetdir}/${i##*/}"
done

echo "Завершено!"


Назвать например jpeg_conv, положить в папку ~/bin (создать если нет), и сделать:
chmod +x ~/bin/jpeg_convТеперь открыв терминал в любой нужной папке можно просто вызывать скрипт
и делать конвертацию картинок из текущей папки в папку назначения:
jpeg_conv "/путь/до/папки/назначения"

 

Страница сгенерирована за 0.578 секунд. Запросов: 23.