왜 가족 전체가 백업되나요?

왜 가족 전체가 백업되나요?

내 홈 디렉토리에 있는 일부 파일을 백업하고 싶습니다. 그건

  • 내 홈 루트 디렉터리에 있는 간단한 파일
  • ~/worthaving.txt에 나열된 내 집의 일부 디렉토리

worthaving.txt 예:

cloud
work/web
work/python

나는 이 스크립트를 만들었습니다:

#!/bin/bash
srce=/home/poor
dest=/run/media/poor/backup
mkdir -p $dest

cp -v $srce/* $dest/ # simple files

while IFS= read -r worth
do
    mkdir -p $dest/$worth
    cp -Rv $srce/$worth $dest/$worth # dirs that matters
done < "$srce/worthsaving.txt"

그러나 나는 내가 원하는 것뿐만 아니라 내 집 전체를 poor백업 루트 아래의 디렉터리에 저장하게 되었습니다.

뭐가 문제 야?

답변1

백업할 파일 목록에 빈 줄이 있습니다. 루프 내에서 이는 $worth비어 있음을 의미하며, 결과적으로 다음 명령이 실행됩니다.

cp -Rv /home/poor /run/media/poor/backup/

아직 명확하지 않은 경우 전체 홈 디렉터리가 poor대상의 대상 디렉터리에 복사됩니다.

루프의 올바른 모습은 다음과 같습니다.

while IFS= read -r worth
do
    if [ -n "$worth" ] && [ -d "$worth" ]
    then
        mkdir -p "$dest/$worth"
        cp -Rv "$srce/$worth" "$dest/$worth" # dirs that matters
    fi
done < "$srce/worthsaving.txt"

의견에서 제안한 대로 다음을 모두 대체할 수 있습니다 rsync.

rsync -rtR --files-from "$srce/worthsaving.txt" "$srce/" "$dest/"

-a개인적으로는 ( --archive) 대신 -rt( )를 사용했을 텐데 --recursive --times, 그렇게 하지 않았기 때문에 cp -a최소 권장 플래그도 그대로 사용하겠습니다 rsync.

서술자로서,언제나변수를 사용할 때는 큰따옴표 *를 사용하세요 . 이는 쉘의 토큰화 및 와일드카드 효과로부터 보호합니다. 예를 들어, my bin에 할당된 디렉토리를 반복하는 것을 고려해 보십시오 $worth. 큰따옴표가 없으면 다음과 같은 올바르지 않고 예상치 못한 명령이 발생합니다.

cp -Rv /home/poor/my bin /run/media/poor/backup/my bin

/home/poor/my여기서는 세 개의 파일 또는 디렉터리( , bin현재 디렉터리 및 /run/media/poor/backup/my)를 대상 디렉터리로 복사하려고 시도합니다.bin


* 적어도 특정 상황에서 왜 그렇게 하지 않는지 이해할 때까지는 항상. 그렇더라도 다시 생각해 보세요.

관련 정보