rsyncを使用していくつかのフォルダとアーカイブをローカルにコピーしたいbashスクリプトがあります。私は次のようなものがあります:
RootFolder
A
B
C
D
D1
D2
D3
.
.
.
DN
E
F
私が欲しいもの/したいこと:
- 始める前に運命フォルダをクリーンアップします。オプションを使用してこれを行います。
--delete
- オプションを使用して実行する特定の種類のファイルを除外します
--exclude
。 - オプションを使用して実行している一部のフォルダを除外します
--exclude
。
したがって、その前にフォルダA、B、D、およびEのコピーが必要です。
ただし、Dから一部のサブフォルダをコピーすると、リストはリストに従って変更されます。
私が望むものを想像してください。
A
B
D
D2
D4
D8
E
--include
試してみましたが間違っていたので、どうすればいいかわかりません。
私は同様のことをしています:
rsync -av --delete --include=/D/D2 --include=/D/D4 --include=D8 --exclude=/C --exclude=/F RootFolder/ DestinyFolder
しかし、うまくいきません…繰り返しを少し試してみましたが、それともこのすべてを変数で包んでrsyncに渡すことができるかもしれません。
別の質問があります。パラメータを介してターゲットフォルダをインポートするときにユーザーが "../"を使用し、--deleteオプションがある場合はどうなりますか?現在のフォルダは削除されますか?ユーザーが「/」だけを書くと、すべてが削除されますか?
編集する: 持っている:
RootFolder
A
File.txt
.HidenFile
B
C
D
D1
D2
File.txt
.HidenFile
D3
.
.
.
DN
E
F
私は次のようなものを持っています
rsync -av --delete --include=/D/D2 --include=/D/D4 --include=D8 --exclude=*.txt --exclude=.* --exclude=/C --exclude=/F RootFolder/ DestinyFolder
答え1
--include
とのオプションは--exclude
左から右に適用されます。最初のオプションは常に最も強力なので、リストを終了して追加の--exclude='*/'
ディレクトリ処理を停止できます。
ただし、一度使用すると、--exclude='*/'
すべてのファイルとディレクトリの暗黙的な処理が無効になり、含めるファイルとフォルダを明示的に指定する必要があります。
A
、およびを含めようとしていますB
。E
すべてのファイルとフォルダ、D
ディレクトリではなくファイルにしたいです。- あなたが望む
D/D2
,D/D4
,/D/D8
そしてすべてのファイルとフォルダ、 - 他の人はいません。
したがって、次のinclude / excludeステートメントを構成できます。
rsync --dry-run -av --delete
--include '/A' --include '/A/**'
--include '/B' --include '/B/**'
--include '/E' --include '/E/**'
--include '/D'
--include '/D/D2' --include '/D/D2/**'
--include '/D/D4' --include '/D/D4/**'
--include '/D/D8' --include '/D/D8/**'
-exclude '*/'
src/ dst/
bash
配列を処理できるシェルを使用しているため、--include
命令セットを安全に構築できます。例は次のとおりです。
# It's an array
includes=()
# Start with the fixed set of known directories
for known in A B E
do
includes+=('--include' "/$known" '--include' "/$known/**")
done
# Special case
includes+=('--include' '/D')
# Now the changeable set of subdirectories. You might get this list elsewhere
for subdirs in D2 D4 D8
do
includes+=('--include' "/D/$subdir" '--include' "/D/$subdir/**")
done
# Put it all together
rsync --dry-run -av "${includes[@]}" --exclude '*/' src/ dst/