Shell Script за създаване на папки и преместване на файлове в нови папки

Имам инсталирана инсталация на 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

Това, което трябва да направи скриптът, е когато се изпълни, да направи директории във всяка от горните архивни папки с текущата дата, т.е. WB_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 shell, използвайки 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