다음 스크립트를 사용하여 전체 시스템 디렉터리를 백업하려고 합니다.
#!/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/