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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Нужны советы по скрипту  (Прочитано 1384 раз)

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

Оффлайн Gadd

  • Автор темы
  • Участник
  • *
  • Сообщений: 209
    • Просмотр профиля
Нужны советы по скрипту
« : 27 Ноября 2010, 20:22:50 »
Нужны советы начинающему по поводу скрипта
Дано:
Есть куча  файлов (фото и видео в фотоаппарате) . Все файлы нужно раскидать по директориям. Название директорий - дата создания файла в формате ГОД-МЕСЯЦ-ДЕНЬ XXXX-XX-XX
Да, эту функцию могут органайзеры фотографий, но немного не так, как мне хотелось бы. Это не обсуждается.
Возникшие вопросы пытаюсь решить сам, поэтому посылать в гугл и предлагать читать маны не надо - все это в процессе. Советы нужны для того, чтобы не пойти в неверном направлении. Также, может кому-нить интересен сам скрипт.


Получился вот такой скрипт (с пояснениями для новичков вроде меня):
(Нажмите, чтобы показать/скрыть)

Теперь собственно вопросы:

# Путь не должен содержать пробелов!!!
SrcDIR=~/DIR
DstDIR=~/DIR
В этой части, для того, чтобы в пути можно было использовать пробелы, пытался делать таким образом:
SrcDIR="~/My DIR"
SrcDIR="~/My\ DIR"
SrcDIR='~/My DIR'
SrcDIR='~/My\ DIR'

Ничего не помогло. Не смертельно, но все-же.

Решено, спасибо MaSsoL. В кавычки заключаем $SrcDIR уже при использовании переменной. Не забываем экранировать пробел "\"


DIR=$(stat -c %y $i | cut -c 1-10)Здесь переменной $DIR присваивается время последнего изменения файла. Хотелось бы вытаскивать время создания файла из EXIF. Что для этого можно посоветовать?


Насколько корректна следующая запись:ERR=$(mv $SrcDIR/$i $DstDIR/$DIR/$i 2>&1 )

for i in *.$1; doКак сделать данную запись нечувствительной к регистру? Можно, конечно сделать и так:
moveFiles JPG
moveFiles AVI
moveFiles jpg
moveFiles avi
или так: for i in *; doНо последний вариант обработает все файлы в директории.


Скрипт, в принципе, простой и, главное, рабочий. Можно к нему прикрутить еще zenity (и видимо, так и сделаю попозже), но - после решения вопросов (с помощью форумчан или самостоятельно)

Список использованной литературы:
1. http://rus-linux.net/MyLDP/HOWTO-ru/Bash-Progr-Intro-HOWTO/Bash-Prog-Intro-HOWTO.html
2. http://tldp.org/LDP/Bash-Beginners-Guide/html/
3. Цикл статей http://habrahabr.ru/blogs/linux/105657/

 
« Последнее редактирование: 27 Ноября 2010, 22:06:23 от Gadd »
Ubuntu 16.04 x86_64
AMD FX X8 8350, Gigabyte 990FXA-UD3 (rev 3.0), GeForce GTX760 2ГБ
Установлены все обновления

Оффлайн MaSsoL

  • Активист
  • *
  • Сообщений: 519
    • Просмотр профиля
Re: Нужны советы по скрипту
« Ответ #1 : 27 Ноября 2010, 21:13:51 »
SrcDIR=~/My\ DIR/
cd "$SrcDIR"
In Console We Trust!

Оффлайн Gadd

  • Автор темы
  • Участник
  • *
  • Сообщений: 209
    • Просмотр профиля
Re: Нужны советы по скрипту
« Ответ #2 : 27 Ноября 2010, 21:29:15 »
SrcDIR=~/My\ DIR/
cd "$SrcDIR"

Точно!!! Не там кавычки ставил. Спасибо! Поправлю текст.
Ubuntu 16.04 x86_64
AMD FX X8 8350, Gigabyte 990FXA-UD3 (rev 3.0), GeForce GTX760 2ГБ
Установлены все обновления

Оффлайн rdf

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Нужны советы по скрипту
« Ответ #3 : 27 Ноября 2010, 22:27:55 »
#!/bin/bash

IFS=$'\t'
find -iname "*.$1" -printf "%CY-%Cm-%Cd\t%p\t%f\n" | while read t f n
do
[ -e $t ] || mkdir $t
mv "$f" "$t/$n"
done

Оффлайн Gadd

  • Автор темы
  • Участник
  • *
  • Сообщений: 209
    • Просмотр профиля
Re: Нужны советы по скрипту
« Ответ #4 : 28 Ноября 2010, 00:42:25 »
#!/bin/bash

IFS=$'\t'
find -iname "*.$1" -printf "%CY-%Cm-%Cd\t%p\t%f\n" | while read t f n
do
[ -e $t ] || mkdir $t
mv "$f" "$t/$n"
done


Тоже вариант. Короче, но гораздо менее понятно. И проблем с регистром, похоже нет
Ubuntu 16.04 x86_64
AMD FX X8 8350, Gigabyte 990FXA-UD3 (rev 3.0), GeForce GTX760 2ГБ
Установлены все обновления

Оффлайн Kwah

  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
Re: Нужны советы по скрипту
« Ответ #5 : 28 Ноября 2010, 04:12:18 »
Всё-таки посоветую посмотреть на Rapid Photo Downloader. Программа сделана для того, чтобы основываясь на EXIF-данных раскидывать отснятый материал по каталогам, переименовывать файлы и т.п. Гибкая в плане настроек.

Оффлайн Дмитрий Бо

  • Погонщик серверов
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 3549
  • Я не техподдержка, я за порядком слежу
    • Просмотр профиля
Re: Нужны советы по скрипту
« Ответ #6 : 28 Ноября 2010, 07:51:28 »
> Хотелось бы вытаскивать время создания файла из EXIF
exiftool -T -createdate

Оффлайн rdf

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Нужны советы по скрипту
« Ответ #7 : 28 Ноября 2010, 15:45:12 »
Тоже вариант. Короче, но гораздо менее понятно. И проблем с регистром, похоже нет
Там ничего сложного нету.
IFS=$'\t'
Эта переменная указывает башу, что будем в качестве разделителя использовать табуляцию (по умолчанию пробел, но вдруг у нас в имени файла есть пробелы)
find -iname "*.$1"
поиск файлов не чувствительный к регистру (если надо чувствительный, то -name)
 -printf "%CY-%Cm-%Cd\t%p\t%f\n"
вывод данных в формате: Год-Месяц-Дата(%CY-%Cm-%Cd) [табуляция(\t)] имя_файла_с_путем(%p) [табуляция(\t)] просто_имя_файла(%f) [enter(\n)]
| while read t f n
вывод команды find попадает в переменные t f n (и так циклически пока еще есть данные на входе)
[ -e $t ] || mkdir $t
если каталог $t не существует, то он создается
mv "$f" "$t/$n"
в этот каталог перемещается файл $f

PS. Кстати, можно было использовать просто mv "$f" "$t/" и тогда не нужна переменная n: while read t f, а для find: find -iname "*.$1" -printf "%CY-%Cm-%Cd\t%p\n"

Оффлайн Gadd

  • Автор темы
  • Участник
  • *
  • Сообщений: 209
    • Просмотр профиля
Re: Нужны советы по скрипту
« Ответ #8 : 28 Ноября 2010, 20:06:43 »
(Нажмите, чтобы показать/скрыть)
Да я в общих чертах разобрался, но за подробности спасибо

Пользователь решил продолжить мысль 28 Ноября 2010, 20:16:08:
Всё-таки посоветую посмотреть на Rapid Photo Downloader. Программа сделана для того, чтобы основываясь на EXIF-данных раскидывать отснятый материал по каталогам, переименовывать файлы и т.п. Гибкая в плане настроек.
Спасибо за совет. Похоже в ней есть то, чего не хватало в других программах (или было реализовано не так, как мне надо) . Но скрипты писать тоже надо учиться  ;)

Пользователь решил продолжить мысль 28 Ноября 2010, 20:16:56:
> Хотелось бы вытаскивать время создания файла из EXIF
exiftool -T -createdate
Спасибо за совет.
« Последнее редактирование: 28 Ноября 2010, 20:16:57 от Gadd »
Ubuntu 16.04 x86_64
AMD FX X8 8350, Gigabyte 990FXA-UD3 (rev 3.0), GeForce GTX760 2ГБ
Установлены все обновления

 

Страница сгенерирована за 0.021 секунд. Запросов: 22.