Сценарий оболочки для создания папок и перемещения файлов в новые папки

У меня настроена установка FreeNAS 9.3, и у меня есть 5 сетевых камер, делающих снимки для совместного использования в NAS. Мне нужен сценарий, который я могу еженедельно запускать как задание cron, перемещая файлы в папки с датами, чтобы было намного проще перейти к определенной дате для наблюдения за камерами.

Структура папок выглядит так:

Корневая папка

/mnt/Data/Camera2

и в этой папке у меня есть мои 5 камер

/mnt/Data/Camera2/CHF
/mnt/Data/Camera2/CHR
/mnt/Data/Camera2/GCMR
/mnt/Data/Camera2/GCMF
/mnt/Data/Camera2/GCMS

В каждой из этих папок камеры сетевая камера автоматически создает папки, такие как Snapshot_time и Record_alarm.

У меня есть архивные папки в

/mnt/Data/Camera2/Archive/CHF
/mnt/Data/Camera2/Archive/CHR
/mnt/Data/Camera2/Archive/GCMR
/mnt/Data/Camera2/Archive/GCMF
/mnt/Data/Camera2/Archive/GCMS

Что мне нужно, чтобы сценарий делал при запуске, делал каталоги в каждой из вышеуказанных архивных папок с текущей датой, т.е. ВБ_21-08-2015

После создания этих каталогов мне нужно переместить содержимое вышеуказанных папок камеры в соответствующие архивные папки.

Я спрашивал на форумах FreeNAS и пока не получил особой помощи, но у меня есть следующий сценарий. Когда я запускаю его, я получаю все виды ошибок...

#!/bin/bash
ROOT_DIR="/mnt/Data/Camera2"
BACKUP_DIRS="$ROOT_DIR/Archive/GCMF $ROOT_DIR/Archive/GCMR $ROOT_DIR/Archive/GCMS $ROOT_DIR/Archive/CHF $ROOT_DIR/Archive/CHR"
DATE=$(date +%d-%m-%Y)
DATE_DIR="WB_$(date +%d-%m-%Y)"
LOG_DIR="$ROOT_DIR/Logs/WB_$(date +%d-%m-%Y)"
LOG_FILE="$LOG_DIR/${DATE}.txt"

/bin/mkdir -p $LOG_DIR

/bin/echo "Weekly DDL camera backup:" > $LOG_FILE
/bin/echo "" >> $LOG_FILE

for FOLDER in $BACKUP_DIRS; do mkdir "${FOLDER}/${DATE_DIR}" >> $LOG_FILE

mv -f -b $ROOT_DIR/GCMF/Snapshot_time $ROOT_DIR/Archive/GCMF/${DATE_DIR}
mv -f -b $ROOT_DIR/GCMR/Snapshot_time $ROOT_DIR/Archive/GCMR/${DATE_DIR}
mv -f -b $ROOT_DIR/GCMS/Snapshot_time $ROOT_DIR/Archive/GCMS/${DATE_DIR}
mv -f -b $ROOT_DIR/CHF/Snapshot_time $ROOT_DIR/Archive/CHF/${DATE_DIR}
mv -f -b $ROOT_DIR/CHR/Snapshot_time $ROOT_DIR/Archive/CHR/${DATE_DIR}
done

Пожалуйста помоги!

РЕДАКТИРОВАТЬ: после запуска исправленного скрипта @Ecnarfi я получаю следующие ошибки:

[root@DaffyDuck] /mnt/Data/Camera2/Scripts# /bin/bash -ex Final.sh
+ ROOT_DIR=/mnt/Data/Camera2
+ BACKUP_DIR=/mnt/Data/Camera2/Archive
+ CAMERAS='GCMF GCMR GCMS CHF CHR'
++ date +%d-%m-%Y
+ DATE=21-08-2015
++ date +%d-%m-%Y
+ DATE_DIR=WB_21-08-2015
++ date +%d-%m-%Y
+ LOG_DIR=/mnt/Data/Camera2/Logs/WB_21-08-2015
+ LOG_FILE=/mnt/Data/Camera2/Logs/WB_21-08-2015/21-08-2015.txt
+ /bin/mkdir -p /mnt/Data/Camera2/Logs/WB_21-08-2015
+ /bin/echo 'Weekly DDL camera backup:'
+ /bin/echo ''
+ for FOLDER in '${CAMERAS}'
+ mkdir /mnt/Data/Camera2/Archive/GCMF/WB_21-08-2015
+ mv -f -b /mnt/Data/Camera2/GCMF/Snapshot_time /mnt/Data/Camera2/Archive/GCMF/WB_21-08-2015
mv: illegal option -- b
usage: mv [-f | -i | -n] [-hv] source target
       mv [-f | -i | -n] [-v] source ... directory

person Ryan    schedule 21.08.2015    source источник
comment
Какие ошибки вы получаете?   -  person choroba    schedule 21.08.2015
comment
запустите свой скрипт с помощью bash -ex , чтобы показать инструкцию и остановиться при первой ошибке   -  person Ôrel    schedule 21.08.2015
comment
Что с явными путями? Исправьте свой PATH один раз и позвольте оболочке найти команды. Жесткое кодирование путей команд может привести только к проблемам (хотя они тоже будут неясными и редкими).   -  person tripleee    schedule 21.08.2015


Ответы (1)


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

Я изменил ваш код, и это работает для меня.

#!/bin/bash

ROOT_DIR="/mnt/Data/Camera2"
BACKUP_DIR="${ROOT_DIR}/Archive"
CAMERAS="GCMF GCMR GCMS CHF CHR"
DATE=$(date +%d-%m-%Y)
DATE_DIR="WB_$(date +%d-%m-%Y)"
LOG_DIR="${ROOT_DIR}/Logs/WB_$(date +%d-%m-%Y)"
LOG_FILE="${LOG_DIR}/${DATE}.txt"

/bin/mkdir -p ${LOG_DIR}

/bin/echo "Weekly DDL camera backup:" > ${LOG_FILE}
/bin/echo "" >> ${LOG_FILE}

for FOLDER in ${CAMERAS}
do
   mkdir ${BACKUP_DIR}/${FOLDER}/${DATE_DIR} >> $LOG_FILE

   mv -f -b ${ROOT_DIR}/${FOLDER}/Snapshot_time ${BACKUP_DIR}/${FOLDER}/${DATE_DIR}

done
person Ecnarfi    schedule 21.08.2015
comment
Большое спасибо, пока все выглядит хорошо, однако я получаю сообщение об ошибке: [Camera2@DaffyDuck] /mnt/Data/Camera2/Scripts% /bin/bash -ex Final.sh + $'\r' Final.sh: line 2: $'\r': command not found - person Ryan; 21.08.2015
comment
Не смог найти, как установить dos2unix или unix2dos на FreeBSD, поэтому я просто открыл редактор в оболочке ssh, используя vi Final.sh Вот что я получил после удаления всех ^M из файла: [пожалуйста, посмотрите мое редактирование в исходном посте] - person Ryan; 21.08.2015
comment
Похоже, ваша версия mv не поддерживает опцию -b. Я думаю, вы можете либо обновиться до версии, которая его поддерживает (если она есть для FreeBSD), либо удалить эту опцию из команды mv, если она вам не нужна. - person Ecnarfi; 21.08.2015
comment
Большой!! удаление опции -b сработало!! Хотя в журнале все нормально, все, что у меня есть, это еженедельная резервная копия камеры DDL:. Как я могу получить остальную часть вывода для отображения там? - person Ryan; 21.08.2015
comment
РЕДАКТИРОВАТЬ: На самом деле после перемещения папок Snapshot_time камеры перестают записывать, поскольку у них нет возможности воссоздать эту папку, только когда вы снова запускаете настройку (мусор, который я знаю). Как мне заставить скрипт перемещать только содержимое папок Snapshot_time? - person Ryan; 21.08.2015
comment
Если ваша версия mkdir поддерживает -v, добавьте это в команду, это должно дать некоторый вывод для добавления в файл журнала. В команде mv измените Snapshot_time на Snapshot_time/*, чтобы переместить содержимое, а не саму папку. - person Ecnarfi; 21.08.2015
comment
Теперь получаю эту странную ошибку после нескольких дней работы: /mnt/Data/Camera2/Scripts/Daily-Move.sh: строка 20: /bin/mv: список аргументов слишком длинный - person Ryan; 25.08.2015