스크립트가 갑자기 다른 디렉터리 대신 시스템 파일을 이동하기 시작합니다.

스크립트가 갑자기 다른 디렉터리 대신 시스템 파일을 이동하기 시작합니다.

아래 스크립트를 사용하여 소스 디렉터리에서 대상 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

글쎄요, 댓글이 5개 달린 후에 답변을 게시해야 할 시점에 도달했습니다. :-)

(이전 댓글은 삭제되었습니다)

나에게 그것은 비어 있는 것처럼 보이고 dstdir1아마도 dstdir2비어 있을 것입니다. 따라서 rsync- 명령 rsync to /.

이러한 오류를 방지하려면 파일 헤더를 변경하십시오(뒤에 후행 공백이 필요함 -).

#!/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사용되지 않으며 쉘스크립트에서는 별칭을 사용하지 않는 것이 좋습니다. 대신 함수를 사용해야 합니다.

관련 정보