내 홈 디렉토리에 있는 일부 파일을 백업하고 싶습니다. 그건
- 내 홈 루트 디렉터리에 있는 간단한 파일
- ~/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
* 적어도 특정 상황에서 왜 그렇게 하지 않는지 이해할 때까지는 항상. 그렇더라도 다시 생각해 보세요.