restic version
出力linux/amd64 で go1.10.4 を使用してコンパイルされたrestic 0.9.6 (v0.9.6-0-gb723ca3d)
デュアルブートの Windows 10 と Ubuntu 18.04 の間で共有されている NTFS パーティションがあり、Ubuntu のrestic でバックアップしています。 ご存じのとおり、Windows 10 は、パーティションのルート ディレクトリにディレクトリ$RECYCLE.BIN
を作成し、ごみ箱に移動されるファイルを保持します。 共有パーティションをバックアップしたいのですが、 $RECYCLE.BIN
ディレクトリはバックアップしません。
さらに下には、私が観察しているものを再現する方法についての詳細な説明があります。 簡単に言えば、バックアップ コマンドで--exclude="\$RECYCLE.BIN"
を使用すると、ディレクトリが除外され、「$RECYCLE.BIN」(または、私が思いつく他のバリアント、以下を参照) が--exclude-file
ます。ディレクトリを除外しないでください。
ローカル リポジトリ (Ubuntu 18.04 の下) と SFTP 経由のリモート リポジトリ (Ubuntu 18.04 でもバックアップを実行) の両方で動作を観察します。
フォルダー$RECYCLE.BIN
は、除外ファイルに追加されるとバックアップから除外されます。
フォルダー$RECYCLE.BIN
は、除外ファイルに追加されていますが、バックアップに含まれています。
一時テスト ディレクトリ内で、bash で次のコマンドを発行します。
# prepare the directory to be backed up
mkdir "data";
mkdir "data/\$RECYCLE.BIN";
touch "data/backup_this";
touch "data/\$RECYCLE.BIN"/ignore_this";
# init repo
mkdir "repo";
restic init --repo=repo/
# prepare exclude file
echo "\$RECYCLE.BIN" > exclude.file
restic --repo=repo/ backup --verbose --verbose data/
発行すると、次のようになります。
open repository
enter password for repository:
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
start scan on [data/]
start backup on [data/]
scan finished in 0.257s: 2 files, 0 B
new /data/$RECYCLE.BIN/ignore_this, saved in 0.004s (0 B added)
new /data/backup_this, saved in 0.000s (0 B added)
Files: 2 new, 0 changed, 0 unmodified
Dirs: 0 new, 0 changed, 0 unmodified
Data Blobs: 0 new
Tree Blobs: 1 new
Added to the repo: 372 B
processed 2 files, 0 B in 0:00
snapshot 27c00c6b saved
予想通り。
restic --repo=repo/ backup --verbose --verbose --exclude="\$RECYCLE.BIN" data/
利回りを発行する
open repository
enter password for repository:
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
using parent snapshot 27c00c6b
start scan on [data/]
start backup on [data/]
scan finished in 0.257s: 1 files, 0 B
unchanged /data/backup_this
Files: 0 new, 0 changed, 1 unmodified
Dirs: 0 new, 0 changed, 0 unmodified
Data Blobs: 0 new
Tree Blobs: 1 new
Added to the repo: 372 B
processed 1 files, 0 B in 0:00
snapshot 61c27a16 saved
これも期待されます。
ただし、 restic --repo=repo/ backup --verbose --verbose --exclude-file=exclude.file data/
発行します。ここで
$ cat exclude.file
$RECYCLE.BIN
結果
open repository
enter password for repository:
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
using parent snapshot 61c27a16
start scan on [data/]
start backup on [data/]
scan finished in 0.211s: 2 files, 0 B
unchanged /data/backup_this
new /data/$RECYCLE.BIN/ignore_this, saved in 0.003s (0 B added)
Files: 1 new, 0 changed, 1 unmodified
Dirs: 0 new, 0 changed, 0 unmodified
Data Blobs: 0 new
Tree Blobs: 0 new
Added to the repo: 0 B
processed 2 files, 0 B in 0:00
snapshot 9a62470f saved
つまり、ディレクトリは除外ファイルに存在しますが、バックアップから除外されません。
除外ファイルのさまざまなバリエーション (ドル記号のエスケープ、引用符の追加、ファイルの最後への改行の追加) も試しましたが、ディレクトリを除外するための制限はありませんでした。
厄介な文字 (ドル記号など) を含む除外ファイルからのファイル名を処理する場合、何らかのエラーが発生するに違いないと思います。
残念ながら、私は go についてはわかりません (私は C++ しか流暢ではありません) が、奇妙な文字を含むファイル名を処理する場合、OS および/またはファイルシステムとの対話に何か問題があるに違いありません。
私は、ローカルとリモートの両方のバックアップにresticを広く使用しています。 これからも頑張ってね!
この問題を解決するために何かお役に立てることがあれば、お知らせください。
--exclude
について$$RECYCLE.BIN
を使用します。
参照: https://restic.readthedocs.io/en/latest/040_backup.html#except -files
そうですね、ありがとう、ドキュメントのこの 1 つの段落を正確に見落としていたようです。
それはうまくいくようです:
$ cat exclude.file
$$RECYCLE.BIN
そしてrestic --repo=repo/ backup --verbose --verbose --exclude-file=exclude.file data/
再度発行すると、
open repository
enter password for repository:
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
using parent snapshot 96bdd658
start scan on [data/]
start backup on [data/]
scan finished in 0.211s: 1 files, 0 B
unchanged /data/backup_this
Files: 0 new, 0 changed, 1 unmodified
Dirs: 0 new, 0 changed, 0 unmodified
Data Blobs: 0 new
Tree Blobs: 0 new
Added to the repo: 0 B
processed 1 files, 0 B in 0:00
snapshot 5c475b96 saved
予想通り。
ただし、10 年以上の Linux の経験の中で、 \$
ではなく$$
$
をエスケープする必要があることに遭遇したことはありませんが、ドキュメントに記載されているように、これは標準のようです。 os.ExpandEnv
場合、これはresticに固有ではありません。
ただし、 restic --repo=repo/ backup --verbose --verbose --exclude="$$RECYCLE.BIN" data/
は
open repository
enter password for repository:
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
using parent snapshot 5c475b96
start scan on [data/]
start backup on [data/]
scan finished in 0.204s: 2 files, 0 B
new /data/$RECYCLE.BIN/ignore_this, saved in 0.002s (0 B added)
unchanged /data/backup_this
Files: 1 new, 0 changed, 1 unmodified
Dirs: 0 new, 0 changed, 0 unmodified
Data Blobs: 0 new
Tree Blobs: 0 new
Added to the repo: 0 B
processed 2 files, 0 B in 0:00
snapshot ed44b219 saved
これは非常に一貫性がなく、直感に反するようです。
--exclude="$$RECYCLE.BIN"
の二重引用符は、シェルが$$
を現在の PID に展開することを意味します。 一重引用符で試してください: --exclude='$$RECYCLE.BIN'
(例えば、 echo "$$RECYCLE.BIN"
とecho '$$RECYCLE.BIN'
)
@kontakm問題は解決したようです。 その場合は閉じてください。