rsync를 사용하여 시스템 데이터를 백업하면 "해당 파일이 없습니다"라는 메시지가 나타납니다.

rsync를 사용하여 시스템 데이터를 백업하면 "해당 파일이 없습니다"라는 메시지가 나타납니다.

다음 스크립트를 사용하여 전체 시스템 디렉터리를 백업하려고 합니다.

#!/bin/bash

cd /

BACKUP_LOCATION=/media/data/backup/system-backup/

echo Backing up system data to $BACKUP_LOCATION, excluding home directories
sudo rsync -aAXv --exclude={"/home/*", "/swap.img", "/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / $BACKUP_LOCATION

이 프로그램을 실행할 때 다음 오류가 발생합니다.

sending incremental file list
rsync: [sender] link_stat "/swap.img," failed: No such file or directory (2)
rsync: [sender] change_dir "/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*," failed: No such file or directory (2)

내가 이해한 바로는 제외 경로는 소스 디렉토리(/)에 상대적입니다. 따라서 예를 들어 /home/*은 실제 파일 시스템에서 /home/*로 해석되어야 합니다. 내가 여기서 뭘 잘못하고 있는지 말해 줄 수 있는 사람이 있나요?

답변1

명령을 실행할 때

sudo rsync -aAXv --exclude={"/home/*", "/swap.img", "/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / $BACKUP_LOCATION

중괄호 확장을 지원하는 쉘은 올바른 형식의 중괄호 표현식이 포함된 단어에 대해서만 지원합니다. 예를 들어 다음을 실행하여 명령이 어떻게 해석되는지 테스트할 수 있습니다.

 bash -xc 'rsync -aAXvn --exclude={"/home", "/swap.img", "/dev"} / /media/data/backup/system-backup/' 2>&1 | grep ^\+

밝혀지다

+ rsync -aAXvn '--exclude={/home,' /swap.img, '/dev}' / /media/data/backup/system-backup/

즉, 쉘은 단어 분할을 --exclude={"/home", "/swap.img", "/dev"}세 개의 인수 --exclude={/home,(닫는 중괄호가 없기 때문에 올바른 형식의 중괄호 표현식이 아님), /swap.img,(쉼표 포함) 및 로 분리합니다 /dev}.

명령으로 변경된 경우

bash -xc 'rsync -aAXvn --exclude={"/home","/swap.img","/dev"} / /media/data/backup/system-backup/' 2>&1 | grep ^\+

실행 후에는 세 개의 개별 인수로 올바른 중괄호 확장이 표시됩니다 --exclude.

+ rsync -aAXvn --exclude=/home --exclude=/swap.img --exclude=/dev / /media/data/backup/system-backup/

관련 정보