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


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

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

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

Оффлайн vnsmirnv

  • Автор темы
  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Пакетная обработка фоток
« : 21 Апреля 2017, 20: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

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #1 : 21 Апреля 2017, 20:24:25 »
Код: (bash) [Выделить]
while read i ; do

done < <(find "$SOURCE" -iregex '.*\.jpe?g')
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн vnsmirnv

  • Автор темы
  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #2 : 21 Апреля 2017, 21:04:05 »
Код: (bash) [Выделить]
while read i ; do

done < <(find "$SOURCE" -iregex '.*\.jpe?g')
Эмм, не пойму как это все должно стоять в скрипте(((
Если так
Код: (bash) [Выделить]
find "$SOURCE" -iregex '.*\.jpe?g' | while read i; do
  echo "Working on $i ..."
  convert "$i" -resize 1024 -quality 90 $TARGET/$i ;
 done
echo " "
echo "... Done!"
echo " "
exit 0

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

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #3 : 21 Апреля 2017, 22:13:05 »
Код: (bash) [Выделить]
while read i ; do
    echo "Working on $i ..."
    convert "$i" -resize 1024 -quality 90 "$TARGET/$i"
done < <(find "$SOURCE" -iregex '.*\.jpe?g')
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн vnsmirnv

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

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #5 : 22 Апреля 2017, 14:07:48 »
Код: (bash) [Выделить]
find "$SOURCE" -iregex '.*\.jpe?g' \
| while read i
do
    echo "Working on $i ..."
    convert "$i" -resize 1024 -quality 90 "${TARGET}/${i}"
done

Оффлайн vnsmirnv

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

Оффлайн ReNzRv

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

Оффлайн vnsmirnv

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

Оффлайн ReNzRv

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

Код: (bash) [Выделить]
find "$SOURCE" -type f -iregex '.*\.jpe?g' \
| while read i
do
    echo "Working on $i ..."
    convert "$i" -resize 1024 -quality 90 "${TARGET}/${i##*/}"
done

Оффлайн vnsmirnv

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

Оффлайн ReNzRv

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

Оффлайн vnsmirnv

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

    find "$SOURCE" -type f -iregex '.*\.jpe?g' \
    | while read i
    do
# Чтоб знать, что не зависло
echo "$i"
 exiv2 \
 -Tk mv "$i" "$i"

done

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: Пакетная обработка фоток
« Ответ #13 : 22 Апреля 2017, 18: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.036 секунд. Запросов: 23.