Код: Выделить всё
#!/bin/sh
BASE_DIR="/shared/photo/razbor"
SORT_DIR="/shared/photo/sorted"
# Поиск JPG файлов в указанной папке и рекурсивно во всех подпапках
find "${BASE_DIR}" -iname "*.jpg" | sort | while IFS= read -r FILE_NAME ; do
FILE_DATE=`stat -f%Sm -t'%Y:%m:%d' "$FILE_NAME"`
FILE_TIME=`stat -f%Sm -t'%H:%M:%S' "$FILE_NAME"`
# Получение даты и времени из Exif.Photo.DateTimeOriginal или Exif.Image.DateTime
for EXIM_DATA in "Exif.Photo.DateTimeOriginal" "Exif.Photo.DateTimeDigitized" "Exif.Image.DateTime" ; do
# Дополнительно: замена разделителей ( - _ . , \ / ) на (:), удаление пробелов и удаление нулевого года
PHOTO_DATE=`exiv2 -g "$EXIM_DATA" -Pv "$FILE_NAME" | awk '{ print $1 }' | sed 's/[-_\.,/\]/:/g;s/[ ]//g;s/0000//g'`
PHOTO_TIME=`exiv2 -g "$EXIM_DATA" -Pv "$FILE_NAME" | awk '{ print $2 }' | sed 's/[-_\.,/\]/:/g;s/[ ]//g;s/0000//g'`
if [ -n "$PHOTO_DATE" ] && [`echo -n "$PHOTO_DATE" | wc -c` -eq 10 ]; then
break; # Если дата найдена, перебор прекращается
fi
done
# Если в exif дата не найдена или формат даты не 10 символов, берется дата изменения (создания) файла
if [ -z "$PHOTO_DATE" ] || [`echo -n "$PHOTO_DATE" | wc -c` -ne 10 ] ; then
PHOTO_DATE=$FILE_DATE; PHOTO_TIME=$FILE_TIME
exiv2 -M"set $EXIM_DATA Ascii $PHOTO_DATE $PHOTO_TIME" "$FILE_NAME"
else
# Если год идет последним dd:mm:YYYY надо поменять на YYYY:mm:dd
if [ `echo -n "$PHOTO_DATE" | awk -F: '{print $3}' | wc -c` -eq 5 ] ; then
PHOTO_DATE=`date -j -f "%d:%m:%Y" "$PHOTO_DATE" "+%Y:%m:%d"`
exiv2 -M"set $EXIM_DATA Ascii $PHOTO_DATE $PHOTO_TIME" "$FILE_NAME"
fi
# Надо бы сверить соответствие даты EXIF с датой файла и в случае необходимости поменять дату файла (exiv2 -M всегда меняет на текущую дату)
FILE_DATE=`stat -f%Sm -t'%Y:%m:%d' "$FILE_NAME"`
if [ "$PHOTO_DATE" != "$FILE_DATE" ] ; then
# Функция exiv2 -T берет данные из Exif.Photo.DateTimeOriginal, если там пусто, выдает - Отметка времени создания снимка в файле отсутствует
if [ "$EXIM_DATA" != "Exif.Photo.DateTimeOriginal" ] ; then
exiv2 -M"set Exif.Photo.DateTimeOriginal Ascii $PHOTO_DATE $PHOTO_TIME" "$FILE_NAME"
fi
exiv2 -T "$FILE_NAME"
fi
fi
# Создание структуры папок гггг/мм/дд
#PHOTO_DIR="$SORT_DIR/`echo $PHOTO_DATE | awk -F: '{ print $1 }'`/`echo $PHOTO_DATE | awk -F: '{ print $2 }'`/`echo $PHOTO_DATE | awk -F: '{ print $3 }'`"
# Создание структуры папок гггг/мм
PHOTO_DIR="$SORT_DIR/`echo $PHOTO_DATE | awk -F: '{ print $1 }'`/`echo $PHOTO_DATE | awk -F: '{ print $2 }'`"
mkdir -p -m 777 $PHOTO_DIR
# Копируем фотографию, только если исходный файл новее существующего или отсутствует. При копировании сохраняется дата создания фотографии
#cp -nvp "$FILE_NAME" "$PHOTO_DIR"
mv -nv "$FILE_NAME" "$PHOTO_DIR"
done
1) mkdir не умеет создавать каталоги с указанием требуемой даты - как поступать в данной ситуации? Вопрос критически важный, так как при последующем доступе к отсортированному контенту, сортировка по дате каталогов тоже будет включена.
2) При такой реализации кода возникает проблема с обработкой файлов в которых вообще отсутствует EXIF, они вместо переноса копируются что выглядит довольно странно. В EXIF заносится дата, при этом файл получает текущую дату, а вот далее по скрипту где то сбой идет. Есть подозрение, что файл остается занятым процессом создания EXIF информации, а скрипт продолжает свою работу не дождавшись когда файл освободится. Отсюда вопрос:
a) Как в теле программы явно указать ждать завершения кода предыдущей команды, хотя по умолчанию shell вроде так и работает!?
b) Может это виновата программа, т.е.
Код: Выделить всё
exiv2 -M"set $EXIM_DATA Ascii $PHOTO_DATE $PHOTO_TIME" "$FILE_NAME"
Были еще вопросы, но не помню, а эти самые важные.