LINUX.ORG.RU

А должно?

anonymous
()

А ты понимаешь, что такие кавычки `что-нибудь` эквивалентны $(что-нибудь), а не 'что-нибудь'? Ну, за полную эквивалентность не отвечаю, но это значит «выполнить команду „что-нибудь“ и подставить вывод сюда».

Если понимаешь, то как должно работать вот это?

FILE=`ls *.[jJ][pP][gG] 2>/dev/null`

Y=`file $i`

proud_anon ★★★★★
()
Ответ на: комментарий от sdio

Хорошо. Замысел был такой

#!/bin/sh

TMP='/home/smal/tmp/'
PHOTO='/home/smal/photo/'
FILE=`ls *.[jJ][pP][gG] 2>/dev/null`
YEAR=`exiv2 $i 2>/dev/null |grep Отметка|cut -d " " -f 4|cut -c 1-4`
MONTH=`exiv2 $i 2>/dev/null |grep Отметка|cut -d " " -f 4|cut -c 6,7`
DAY=`exiv2 $i 2>/dev/null |grep Отметка|cut -d " " -f 4|cut -c 9,10`
MOVETO=${PHOTO}/${YEAR}/${YEAR}-${MONTH}/${YEAR}-${MONTH}-${DAY}

for i in ${FILE}; do if [ -z ${YEAR} ]
       then
               echo "Отсутствует отметка времени снимка $i. Оставляем в ${TMP}"
       else
               exiv2 -r"%Y-%m-%dT%H:%M:%S" rename $i
               mkdir -p ${MOVETO}
               mv $i ${MOVETO}
       fi;
done

это набросок. но на выше указанной проблеме я и провалился.

SmaL
() автор топика
Ответ на: комментарий от SmaL

Тьфу, от убожеского башевского синтаксиса блевать хочется.
ls не поддерживает регулярные выражения.
ls | grep [Jj][Pp][Gg] 2> /dev/null
спасет тебя

babusha
()
Ответ на: комментарий от SmaL

for i in ${FILE}; do
echo ${Y}

for i in $FILE; do
echo $Y

Если ты не тупой, толстый, жирный, тролль то качай учебник по ruby

babusha
()
Ответ на: комментарий от sdio

да, я хотел этого избежать, но с моими скиллами красивые скрипты писать рановато.
спасибо, пошёл за учебниками.

SmaL
() автор топика
Ответ на: комментарий от SmaL

schwach

>> ${YEAR}

Если подумать, то взяться ему во время выполнения цикла неоткуда. Как и другим предварительно вычисляемым переменным с $i — её ещё нет же.

GotF ★★★★★
()
Ответ на: комментарий от SmaL

>ничего, естественно :)

Ну, еще можно попробовать заменить ${YEAR} на $YEAR или $($YEAR) в зависимости от контекста.

Еще можно shebang поменять на #!/bin/bash. Он на это реагирует. Я не помню, ${VAR} - башизм или нет.

Я в любом случае не понимаю, как вот это должно работать, если i там еще не определена:
YEAR=`exiv2 $i 2>/dev/null |grep Отметка|cut -d " " -f 4|cut -c 1-4`

proud_anon ★★★★★
()
Ответ на: schwach от GotF

т.е. её надо внутрь цикла?
Действительно швах :)
спасибо!

SmaL
() автор топика
Ответ на: комментарий от SmaL

Запихни все в цикл. Т.к.

YEAR=`exiv2 $i 2>/dev/null |grep Отметка|cut -d " " -f 4|cut -c 1-4`
работать не будет. Переменная $i не определена. И убери все гасилки STDERR.

TGZ ★★★★
()

1. Уверены что /bin/sh это симлинк на баш?
2. Упражнения на бревне с ls не нужны. Делайте сразу
for i in *.[jJ][pP][gG]
3. Вместо grep и cut думаю оптимальнее будет awk
4. Backticks - отстой


2babusha
Для таких простых задач руби это излишество, а шелл само то. Уже все поняли что шелл вы не знаете, поэтому пытаетесь перевести разговор в более кофмортную для вас область, при этом ещё и топикстартера плохому учите

zolden ★★★★★
()
Ответ на: комментарий от zolden

1. Уверены что /bin/sh это симлинк на баш?


Принято

2. Упражнения на бревне с ls не нужны. Делайте сразу

for i in *.[jJ][pP][gG]


А если поиск выполняется в другой директории?
for i in ${TMP}*.[jJ][pP][gG] - будет верным?
Хотя, почему нет? Будет.
Принято

3. Вместо grep и cut думаю оптимальнее будет awk


я этот man awk никак раскурить не могу :)

4. Backticks - отстой

В глобальном понимании? Я знаю только об одной альтернативе - case. Но в этом случае разницы вроде нет.

SmaL
() автор топика
Ответ на: комментарий от SmaL

3. Покажите пример вывода exiv2
4. Backticks это обратные кавычки (`), которые вы использовали в своём примере. Рекомендации лучших собаководов - использование синтаксиса $(command) который лучше читается и который не перепутаешь с другими кавычками. Тем более, что не все знают где на клавиатуре эти обратные кавычки (я например только недавно узнал)

zolden ★★★★★
()
Ответ на: комментарий от zolden

3

smal ~/photo/2010/2010-04/2010-04-11> exiv2 2010-04-11T12:32:29.JPG 
Имя файла: 2010-04-11T12:32:29.JPG
Размер файла: 4988395 Байт
Тип MIME     : image/jpeg
Размер изображения: 2848 x 4256
Camera make     : FUJIFILM
Модель камеры: FinePix S5Pro  
Отметка времени снимка: 2010:04:11 12:32:29
Номер снимка: 
Время экспозиции: 1/142 s
Диафрагма: F6.3
Смещение экспозиции: 0 EV
Вспышка  : No, compulsory
Flash bias      : 
Фокусное расстояние: 40.0 mm ( (35мм эквивалент): 60.0 mm)
Расстояние до объекта: 
Светочувствительность: 100
Режим экспозиции: Авто
Режим замера: Multi-segment
Режим макросъёмки: 
Качество изображения: FINE   
Разрешение Exif: 2848 x 4256
Баланс белого: Авто
Эскиз      : image/jpeg, 8938 Байт
Авторские права:                                                                                                                                                                                                                                                                ,                                                                                                                                                                                                                                                                
Комментарий Exif:

4. $(command) - можно пример?
$(exiv2 *.jpg | grep ...) так?

SmaL
() автор топика
Ответ на: комментарий от SmaL

Ok. На баше строки-массивы работают похоже, но я тестил только на zsh

YEAR=`exiv2 $i 2>/dev/null |grep Отметка|cut -d " " -f 4|cut -c 1-4`
MONTH=`exiv2 $i 2>/dev/null |grep Отметка|cut -d " " -f 4|cut -c 6,7`
DAY=`exiv2 $i 2>/dev/null |grep Отметка|cut -d " " -f 4|cut -c 9,10

заменяем на

timestamp=$(exiv2 $i | grep Отметка)
YEAR=$timestamp[25,28]
MONTH=$timestamp[30,31]
DAY=$timestamp[33,34]

В timestamp у нас теперь строка «Отметка времени снимка: 2010:04:11 12:32:29», через запятую указываем с какого по какой символ брать.

Получилось и короче и в несколько раз быстрее, но в домашних условиях это абсолютно не критично

4. Ваш пример правильный, мой вы тоже уже видели и всё поняли

zolden ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.