Нужны советы начинающему по поводу скрипта
Дано:
Есть куча файлов (фото и видео в фотоаппарате) . Все файлы нужно раскидать по директориям. Название директорий - дата создания файла в формате ГОД-МЕСЯЦ-ДЕНЬ XXXX-XX-XX
Да, эту функцию могут органайзеры фотографий, но немного не так, как мне хотелось бы. Это не обсуждается.
Возникшие вопросы пытаюсь решить сам, поэтому посылать в гугл и предлагать читать маны не надо - все это в процессе. Советы нужны для того, чтобы не пойти в неверном направлении. Также, может кому-нить интересен сам скрипт.
Получился вот такой скрипт (с пояснениями для новичков вроде меня):
#! /bin/bash
# Задаем папку-источник ($SrcDIR) и папку назначения ($DstDIR)
SrcDIR=~/My\ DIR
DstDIR=~/My\ DIR
# Переходим в папку-источник
cd "$SrcDIR"
# Функция считывает дату последнего изменения файла и перемещает файл в директорию с таким же названием.
# Расширение обрабатываемых файлов передается в параметре функции
function moveFiles {
# Перебираем все файлы в папке, имеющие расширение, передаваемое в параметре функции
for i in *.$1; do
# Считываем время последнего изменения файла и вырезание первых 10-и символов. Полученная строка будет служить названием папки $DIR
# stat : "-c" - использование указанного формата (%y); "%y" - время последней модификации файла
# cut : "-c" - выбрать только заданные символы; "1-10" - задание диапазона символов
DIR=$(stat -c %y $i | cut -c 1-10)
# Пеменной $ERR возвращается ошибка, выдаваемая командой mv, с помощью "2>&1" (запись стандартного потока ошибок в стандартный вывод)
ERR=$(mv -n "$SrcDIR"/$i "$DstDIR"/$DIR/$i 2>&1 )
# Если длина строки "$ERR" ненулевая (выражение "-n"), то есть присутствует ошибка при выполнении команды "mv" (отсутствует папка $DIR),
# то папка создается и файл i-тый файл перемещается в неё
if [ -n "$ERR" ]; then
mkdir "$DstDIR"/$DIR
mv -n $i "$DstDIR"/$DIR/$i
fi
done
}
moveFiles JPG
moveFiles AVI
Теперь собственно вопросы:
# Путь не должен содержать пробелов!!!
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.html2.
http://tldp.org/LDP/Bash-Beginners-Guide/html/3. Цикл статей
http://habrahabr.ru/blogs/linux/105657/