leonder 12.06.2010 11:10

СкриптыЗагрузка фотографий с цифровой камеры по usb с сортировкой по дате

Мне не очень повезло с фотокамерой, при подключении к компьютеру она не желает определяться, как блочное устройство (съемный диск), ее файловая система не доступна. Она определяется, как цифровая камера, и поэтому можно работать с ней только с помощью специальных программ (GtKam, DigiKam, gphotofs и иже с ними). Программ этих множество, но их работа не кажется мне быстрой и удобной, поэтому для получения фоток с камеры я написал небольшой костыль скрипт.
Мне не очень повезло с фотокамерой, при подключении к компьютеру она не желает определяться, как блочное устройство (съемный диск), ее файловая система не доступна. Она определяется, как цифровая камера, и поэтому можно работать с ней только с помощью специальных программ (GtKam, DigiKam, gphotofs и иже с ними). Программ этих множество, но их работа не кажется мне быстрой и удобной, поэтому для получения фоток с камеры я написал небольшой костыль скрипт.

ОБНОВЛЕНО: Решена проблема с дубликатами и сортировкой.

Работа сценария состоит из двух частей: сначала фото и видео загружается во временный каталог, расположенный (создающийся) в базовой директории, которая в целом является как бы буфером для получения фоток с камеры. Затем из фото извлекаются exif данные о времени снимка и с их помощью создается древовидная структура каталогов вида год/месяц/число (Обменка/2010/06/15). И фото перемещаются в соответствующие каталоги. Видеофайлы пока остаются во временном каталоге.

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/bin/bash
BASEDIR="/home/leonder/photo/CanonPowerShotA1100IS"
TMP="${BASEDIR}/tmp"
#Creation the temp. dir
if ! [ -d "$TMP" ] ; then mkdir -p "$TMP"; fi
#Enter to temp. dir
cd "$TMP"
#Counter downloaded files
I=0
#Get the list of files on camera and direct them to "while"
gphoto2 --port 'usb' -L | grep ^# | awk '{ print $1, $2 }' |
(while read STR
do
NUM="$(echo "$STR" | awk '{ print $1 }' | sed -e s/#// )"
NAME="$(echo "$STR" | awk '{ print $2 }')"
# If file with equality name NOT exists
if [ ! -f "$NAME" ]
then
# Download yet not-existing in temp-dir file and add 1 to counter
gphoto2 --port 'usb' --get-file "$NUM" && I=$(($I+1))
fi
done
#this is "exporting" counter
exit $I
)
echo "Во временный каталог загружено файлов: $?"

# For all JPG files in temp.dir
for F in *.JPG
do
YEAR=$(exiv2 "$F" | grep "Отметка времени" | awk '{ print $4 }' | awk -F: '{ print $1 }')
MONTH=$(exiv2 "$F" | grep "Отметка времени" | awk '{ print $4 }' | awk -F: '{ print $2 }')
DAY=$(exiv2 "$F" | grep "Отметка времени" | awk '{ print $4 }' | awk -F: '{ print $3 }')
TIME=$(exiv2 "$F" | grep "Отметка времени" | awk '{ print $5 }')
DIR="${BASEDIR}/${YEAR}/${MONTH}/${DAY}"
NEW="${DIR}/${TIME}.JPG"
#Creation the directory for current date
if ! [ -d "$DIR" ] ; then mkdir -p "$DIR"; fi
#move each file with sort by date
mv --no-clobber "$F" "${NEW}"
#--no-clobber do not overwrite an existing file
#--update move only when the SOURCE file is newer than the
# destination file or when the destination file is missing
done
#author: Leonid Shatalin, leonder@ya.ru, leonder@jabber.ru
#TODO: Do anything with video (AVI) files, now it will be saved in temp.dir



У меня локализованная версия exiv2, если у вас это не так, то замените в 31-34 grep "Отметка времени" на "Image timestamp". И вообще, в целом, пробегите взглядом, может быть что-то еще под себя следует скорректировать, как минимум, путь к обменной папке.

Сохранил скрипт как getphoto в ~/bin и использую, нажав f4 в dolphin (открыв консоль). Подключаю кабелем к компу, включаю камеру, выполняю команду, дожидаюсь, пока все скачается (или лампочка перестанет мигать на камере), выключаю камеру и смотрю буферный каталог.

Результат работы:
=Дерево каталогов

Первая версия скрипта:

Скрипт использует программу gphoto2 (её же и все модные программы вроде DigiKam используют).

#!/bin/bash
#Создается путь для сохранения - в "буферном" каталоге
#вложенные каталоги с сортировкой по дате
DIR="/home/leonder/photo/Canon PowerShot 1100 IS/`date +%Y` год/`date +%m\ %b`/`date +%d`"
if ! [ -d "$DIR" ]
then mkdir -p "$DIR" && echo "$DIR - каталог создан"
else echo "$DIR - каталог существует"
fi
cd "$DIR"
#По уму надо бы в скрипте же получить имя камеры, но я не могу,
#поэтому свою единственную камеру вручную определил и прописал
#gphoto2 --auto-detect
#почему-то у меня без sudo - gphoto2 не получает фотки...
sudo gphoto2 --camera "USB PTP Class Camera" -P
#фотки (и видео) из-за sudo принадлежат root, надо исправить
sudo chown leonid:users *
#и раз... и два... закончили!
echo "All done!"

Получает он, естественно, всё содержимое, поэтому есть проблема: если не удалять фото после загрузки в комп, то они загрузятся в следующий раз снова, уже в другой каталог и придется удалять дубликаты, а это муторно.



Тэги: bash gphoto камера консоль костыль скрипт фото
+ 4 -
Похожие Поделиться

leonder 12.06.2010 11:13 #
В kde кстати, есть возможность удобно прописать свои действия для подключаемых устройств. Но пока скрипт сырой и не решена проблема дубликатов - использую только вручную
digiwhite 12.06.2010 12:11 #
Ну самый прямой путь для устранения дубликатов - вычисление контрольных сум. Но это годится только именно для полностью одинаковых фотографий. Скажем, 2 фотографии сделанных в течении 1-й 2-х секунд, на которых изображен один и тот же человек, но например, голова уже несущественно сменила наклон - будут различны. Но в "человеческом восприятии" - фото по сути одно и то же.

В KDE наверное есть возможность в скрипт передавать параметры. Так вот, можно было бы не жестко прописывать каталог, а передавать путь к нему из Dolphin`а.
cubiccat 12.06.2010 14:07 #
Можно еще в exif попробовать что-то прописать после синхронизации, а при следующей синхронизации такие файлы отсеивать. Ну или тупо после копирования те файлы, что на фотике переносить в специальную папку, если удалять не желательно.
leonder 12.06.2010 12:23 #
Надо было с этого начинать конечно: http://www.faqs.org/docs/Linux-HOWTO/USB-Digital-Camera-HOWTO.html
leonder 12.06.2010 12:47 #
А вот и не правда (я на англ. яз. не очень быстро соображаю)! Это как раз про те камеры, которые определяются, как блочные устройства (/dev/sd*)

Буду делать на базе autofs и gphotofs, как здесь: http://www.gentoo-wiki.info/Gphoto2

gphotofs собрался из AUR в арче, в репах не было. В общем скоро сделаю.
leonder 12.06.2010 15:00 #
Не удается завести autofs в arch... fail и все тут...

Зато появилась идея - скачать все содержимое, как сейчас, но во временный каталог, $DIR/temp например. Затем для всего, что скачалось создать файл-список где будет сопоставлено имя файла и, допустим, время съёмки из exif, или хэш. Затем каким-то образом сверить фотки с имеющимися в буферном каталоге. Вот тут-то я и теряюсь... каким образом проверять, чтобы нормально было, не знаю
digiwhite 12.06.2010 15:03 #
md5 хеши делайте. Утилиты все есть для этого.
goblinyara 12.06.2010 18:26 #
как сказали выше, если, к примеру, фотки будут практически одинаковыми(чуть смещённый наклон головы), то у неё будет совсем другой хэш... хотя первоначальную отсевку дубликатов по md5 делать довольно правильно...
orkaan 13.06.2010 21:56 #
Вот парочка интересных (python):
  • http://code.activestate.com/recipes/500266-cataloging-and-adding-iptc-keywords-to-digital-pho/
  • http://web-brains.com/2010/05/10/sbros-fotografij-s-fotika-na-komp/
Zend 15.06.2010 08:17 #
А вы настройки камеры крутить не пробовали? Там, возможно есть опция которая говорит камере как себя "преподносить" у меня, например, камера может "общаться" с компьютером и как MassStorage и, как PicBridge. Еще в ней есть режим "Внутренняя память + флешка", тогда помимо Флешки становится доступной и внутренняя память камеры (определяется как CD-ROM на ней записаны какие то модули для MAC-а). Может и вам настройки камеры покрутить?
leonder 15.06.2010 23:55 #
Нет, к сожалению, камера оказалась не очень дружелюбна, такой возможности нет.
dicson 17.06.2010 19:44 #
Работает только с локализованной версией exiv2. У кого не работает - правим строки 31-34. Заменяем "Отметка времени" на "Image timestamp"
EugeneHill 29.10.2011 20:44 #
у меня сыпет syntax error почти в каждой строчке
mironov_orig 29.10.2011 20:50 #
Ума попрваить синтаксис не хватает? за 50р я сделаю эту работу за тебя.
EugeneHill 29.10.2011 21:16 #
иди броди... Коммерсант выискался
mironov_orig 30.10.2011 01:11 #
а ты ничего не умеешь и хочешь, чтобы всё сделали за тебя по первой просьбе за даром?