Shell, SED, AWK и как с этим бороться?

Простые/общие вопросы по UNIX системам. Спросите здесь, если вы новичок

Модераторы: vadim64, terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
SiAl
рядовой
Сообщения: 32
Зарегистрирован: 2012-05-25 10:32:00

Shell, SED, AWK и как с этим бороться?

Непрочитанное сообщение SiAl » 2014-03-16 18:47:08

При написании маленького скрипта по нескольким пунктам сразу попал в тупик и прошу совета, куда смотреть что поменять может. Код кривенький - опыта в шелле совсем как бы нет, может кто посоветует как "более лучше" сделать. Скрипт в общем то взят с инета, он в нескольких вариантах есть но везде не хватает некоторых мелочей. Сам скрипт работает, и даже в таком виде в принципе может устроить, вот только останется немного ручной работы, что при накопленных за десятки лет материалов - долго и муторно.

Код: Выделить всё

#!/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
Кривоватость кода в основном при переформатировании EXIF даты, божешь - какими они только не бывают. Практически уверен в существовании красивого и элегантного кода преобразования дат, кто пользуется подобным прошу помочь. Далее что вообще не могу найти как реализовать:
1) mkdir не умеет создавать каталоги с указанием требуемой даты - как поступать в данной ситуации? Вопрос критически важный, так как при последующем доступе к отсортированному контенту, сортировка по дате каталогов тоже будет включена.
2) При такой реализации кода возникает проблема с обработкой файлов в которых вообще отсутствует EXIF, они вместо переноса копируются что выглядит довольно странно. В EXIF заносится дата, при этом файл получает текущую дату, а вот далее по скрипту где то сбой идет. Есть подозрение, что файл остается занятым процессом создания EXIF информации, а скрипт продолжает свою работу не дождавшись когда файл освободится. Отсюда вопрос:
a) Как в теле программы явно указать ждать завершения кода предыдущей команды, хотя по умолчанию shell вроде так и работает!?
b) Может это виновата программа, т.е.

Код: Выделить всё

exiv2 -M"set $EXIM_DATA Ascii $PHOTO_DATE $PHOTO_TIME" "$FILE_NAME"
exiv2 -M запускает внутренний процесс set $EXIM_DATA Ascii $PHOTO_DATE $PHOTO_TIME при этом тут же сообщая о завершении своей работы? Как делается в таких случаях? Ждать кода возврата if [ $? -eq 0 ] then в данном случае наверно не то?

Были еще вопросы, но не помню, а эти самые важные.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Shell, SED, AWK и как с этим бороться?

Непрочитанное сообщение Alex Keda » 2014-03-16 20:16:50

1. touch заюзать - он умеет дату ставить нужную

по остальному - фиг знает
Убей их всех! Бог потом рассортирует...

SiAl
рядовой
Сообщения: 32
Зарегистрирован: 2012-05-25 10:32:00

Re: Shell, SED, AWK и как с этим бороться?

Непрочитанное сообщение SiAl » 2014-03-17 14:08:02

Alex Keda писал(а):1. touch заюзать - он умеет дату ставить нужную
Да, спасибо, не мог предположить, что утилита для работы с файлами будет обрабатывать и каталоги. Создавать с ее помощью каталоги не получается, а вот поменять время - да! Вот только mkdir еще раз показал себя некрасиво - при создании подкаталога без параметра -p время основного каталога меняется на текущее, я немного в шоке ((

SiAl
рядовой
Сообщения: 32
Зарегистрирован: 2012-05-25 10:32:00

Re: Shell, SED, AWK и как с этим бороться?

Непрочитанное сообщение SiAl » 2014-03-17 16:46:41

SiAl писал(а):Вот только mkdir еще раз показал себя некрасиво - при создании подкаталога без параметра -p время основного каталога меняется на текущее, я немного в шоке ((
Выясняется, что не mkdir виноват, а сама система так себя ведет, любое изменение в каталоге изменяет и его время ((

Аватара пользователя
Neus
капитан
Сообщения: 1980
Зарегистрирован: 2008-09-08 21:59:56

Re: Shell, SED, AWK и как с этим бороться?

Непрочитанное сообщение Neus » 2014-03-17 22:13:01

Дык все правильно, меняется файл - меняется его mtime, а каталог есть файл.