Bashスクリプトとrsync:いくつかのフォルダとサブフォルダのみを含める方法と--deleteで../をパスとして使用するとどうなりますか?

Bashスクリプトとrsync:いくつかのフォルダとサブフォルダのみを含める方法と--deleteで../をパスとして使用するとどうなりますか?

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、およびを含めようとしていますBEすべてのファイルとフォルダ
  • 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/

関連情報