脚本突然启动移动系统文件而不是其他目录

脚本突然启动移动系统文件而不是其他目录

我使用下面的脚本将文件从源目录移动到目的地1目录,然后将文件复制到目的地2目录,有时它工作得很好,但有时突然它开始将整个系统文件移动到,/例如home,,,......目标目录然后整个机器系统被损坏,我必须进行恢复。所以我不确定为什么会发生这种情况,发生这种情况的原因是什么或触发它的原因是什么?etcusr

#!/bin/bash -i
#
alias brc='source ~/.bashrc'
mydir='My-Dir1*'
min_age=5
cdate=$(date +%F)
echo -n "Enter ID: "; read u; echo $u
dstdir1="$(find  /home/myuser/Documents/dstdir1/customers/ -maxdepth 1 -name "*${u}*" -type d)/Transaction_$cdate"
dstdir2="$(find  /home/myuser/Documents/dstdir2/customers/ -maxdepth 1 -name "*${u}*" -type d)/Transaction_$cdate"
mkdir -p $dstdir2
mkdir -p $dstdir1
dir_list=$(find "/home/myuser/Documents/customers/$u/" -type d -iname "$mydir" | grep -iv Recycle.Bin)
echo $dir_list
if [ -z "$dir_list" ]; then
    echo "Error: could not find any directories matching pattern $mydir" >&2
    exit 1
fi
source ~/.bashrc
cwd=$PWD
echo "SELECT THE SOURCE DIRECTORY"

onlyonce=0

select dir in $dir_list; do
    srcdir="/home/myuser/Documents/customers/$u"
    echo "Files will be moved from:"
    echo "$srcdir to"
    echo "$dstdir1 then copied to"
    echo "$dstdir2"
    read -p 'continue (y/n)? ' -r answer
    [ "$answer" = "y" ] || exit 0

    echo "Moving then coping files older than $min_age minutes."
    while :; do
        echo 'setting source file and directory permissions...'
        find "$srcdir" -type d ! -perm 0775 -exec chmod 0775 '{}' \;
        find "$srcdir" -type f ! -perm 0664 -print0 | xargs -0 -r -- chmod 0664
        cd "$srcdir"
        echo 'Moving files...'
        rsync_extra_opts='-ptOW --info=progress2 --no-super --remove-source-files'
        find . -type f -mmin +$min_age -print0 | rsync -0 --files-from=- $rsync_extra_opts ./ "$dstdir1/"
        if [ $? -ne 0 ]; then
            echo 'correcting destination directory permissions...'
            find "$dstdir1" -type d ! -perm 0775 -exec chmod -c 0775 '{}' \;
        fi
        cd "$dstdir1"
        echo 'Coping files...'
        rsync_extra_opts='-ptOW --info=progress2 --no-super'
        find . -type f -mmin +$min_age -print0 | rsync -0 --files-from=- $rsync_extra_opts ./ "$dstdir2/"
        if [ $? -ne 0 ]; then
            echo 'correcting destination directory permissions...'
            find "$dstdir2" -type d ! -perm 0775 -exec chmod -c 0775 '{}' \;
        fi

        cd "$cwd"
        df -h "$srcdir" "$dstdir1" "$dstdir2"
        echo 'sleeping 5 minutes...'
        sleep 5m
        echo ""
    done
    break
done
cd "$cwd"

答案1

我想你的脚本正在运行/,而不受保护的脚本cd "$srcdir"在某个时刻会失败。

一些建议

  • 使用printf语句和/或set -x查看变量包含哪些值
  • 测试时的使用rsync --dry-run及其他无损操作
  • 保护cd "$srcdir"( cd "$srcdir" || continue, 或if cd "$srcdir"; then ...) , 或[[ -d "$srcdir" ]] || continue)
  • 更好的是,不要在任何地方更改目录,并cd通过在rsync

答案2

好吧,在评论五次之后,我已经到了应该发布答案的地步了:-)

(之前的评论已删除)

对我来说,它看起来像dstdir1并且dstdir2可能是空的,因此您的rsync- 命令 rsync 到/.

为了防止此类错误,请更改文件头( 后需要尾随空格-):

#!/bin/bash - 
set -o nounset   # exit on unset variables.
set -o errexit   # exit on any error.

安装shellcheck在您的盒子上可能会有所帮助。

我已经针对你的脚本运行了它,它抱怨第 7、10、11、13、41 和 49 行上未加引号的变量 onlyonce=0。似乎未使用。

该别名brc未使用,我建议不要在 shellscript 中使用别名。你应该使用函数来代替。

相关内容