【问题标题】:Shell Script to create folders and move files to new folders用于创建文件夹并将文件移动到新文件夹的 Shell 脚本
【发布时间】:2015-11-15 05:35:04
【问题描述】:

我安装了 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

【问题讨论】:

  • 你遇到了什么错误?
  • 使用bash -ex 运行脚本以显示指令并在出现第一个错误时停止
  • 显式路径有什么用?修复你的PATH 一次,让shell 找到命令。对命令路径进行硬编码只会导致问题(尽管这些问题也很模糊且很少见)。

标签: bash shell freebsd


【解决方案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

【讨论】:

  • 非常感谢,到目前为止看起来不错,但是我收到错误消息:[Camera2@DaffyDuck] /mnt/Data/Camera2/Scripts% /bin/bash -ex Final.sh + $'\r' Final.sh: line 2: $'\r': command not found
  • 找不到如何在 FreeBSD 上安装 dos2unix 或 unix2dos,所以我只是在 ssh shell 中打开了编辑器,使用 vi Final.sh 这是我取出所有 ^M 后得到的文件:[请查看我对原始帖子的编辑]
  • 看起来你的 mv 版本不支持 -b 选项。我想您可以更新到支持它的版本(如果有适用于 FreeBSD 的版本),或者如果您不需要它,请从 mv 命令中删除该选项。
  • 太棒了!!删除 -b 选项有效!虽然,在它生成的日志中,我所拥有的只是“每周 DDL 相机备份:”。如何让其余的输出显示在那里?
  • 编辑:实际上在移动 Snapshot_time 文件夹后,摄像机会停止录制,因为它们无法重新创建该文件夹,只有当您再次运行设置时(垃圾我知道).. 我该怎么做让脚本只移动 Snapshot_time 文件夹的内容?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
相关资源
最近更新 更多