次のスクリプトを使用してシステムディレクトリ全体をバックアップしようとします。
#!/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"}
3つの--exclude={/home,
引数(閉じる中括弧がないため、正しい形式の中括弧式ではない)、/swap.img,
(カンマを含む)、および区切り文字を区切ります/dev}
。
コマンドで変更した場合
bash -xc 'rsync -aAXvn --exclude={"/home","/swap.img","/dev"} / /media/data/backup/system-backup/' 2>&1 | grep ^\+
実行後、3つの別々の引数が正しい中括弧拡張を表示します--exclude
。
+ rsync -aAXvn --exclude=/home --exclude=/swap.img --exclude=/dev / /media/data/backup/system-backup/