web-dev-qa-db-ja.com

rsync-欠落しているすべての親ディレクトリを作成しますか?

リモート側で不足している親ディレクトリを作成するrsyncのようなプログラムを探しています。

たとえば、1つのサーバーに/top/a/b/c/dがあり、リモートサーバーに/top/aのみが存在する場合、dをリモートサーバーにコピーし、bcディレクトリも作成されます。

コマンド:

rsync /top/a/b/c/d remote:/top/a/b/c

/tmp/a/bがリモートサーバーに存在しないため動作しません。そして、もしそれが存在するなら、ファイルdはパス/top/a/b/cにコピーされます。

これは、--includeおよび--excludeスイッチを使用してrsyncで実行できますが、非常に複雑です。例えば:

rsync -v -r a dest:dir  \
  --include 'a/b'       \
  --include 'a/b/c'     \
  --include 'a/b/c/d'   \
  --include 'a/b/c/d/e' \
  --exclude 'a/*'       \
  --exclude 'a/b/*'     \
  --exclude 'a/b/c/*'   \
  --exclude 'a/b/c/d/*' 

中間ディレクトリにファイルがある場合でも、a/b/c/d/eからdest:dir/a/b/c/d/eのみをコピーします。 (注-包含は除外の前になければなりません。)

他のオプションはありますか?

36
ErikR

あなたが探しているかもしれません

rsync -aR

例えば:

rsync -a --relative /top/a/b/c/d remote:/

他の質問 のこのトリックも参照してください。

18
Balu
rsync -aq --rsync-path='mkdir -p /tmp/imaginary/ && rsync' file user@remote:/tmp/imaginary/

http://www.schwertly.com/2013/07/forcing-rsync-to-create-a-remote-path-using-rsync-path/ からコピー、貼り付けしないでくださいそこから、彼の構文は屠殺されます。

任意のコマンドを実行して、rsync実行可能ファイルのパスを設定できます。

13
Eddie

手動で存在を強制することをお勧めします。

ssh user@remote mkdir -p /top/a/b/c
rsync /top/a/b/c/d remote:/top/a/b/c

これにより、ターゲットフォルダーが存在しない場合は作成されます。

7
mnagel

https://unix.stackexchange.com/a/496181/578 によると、rsync 2.6.7以降、--relativeは、.は、宛先で作成する開始親ディレクトリを固定します。

derek@DESKTOP-2F2F59O:~/projects/rsync$ mkdir --parents top1/a/b/c/d
derek@DESKTOP-2F2F59O:~/projects/rsync$ mkdir --parents top2/a
derek@DESKTOP-2F2F59O:~/projects/rsync$ rsync --recursive --relative --verbose top1/a/./b/c/d top2/a/
sending incremental file list
b/
b/c/
b/c/d/

sent 99 bytes  received 28 bytes  254.00 bytes/sec
total size is 0  speedup is 0.00
1
Derek Mahar

より良いソリューションを探していましたが、サブディレクトリが多すぎて手動で作成できない場合は、私のほうが適しているようです。

--parentsオプションの中間ステップとしてcpを使用するだけです

cp --parents /your/path/sub/dir/ /tmp/localcopy
rsync [options] /tmp/localcopy/* remote:/destination/path/

cp --parentsは構造を作成します。

親フォルダーのサブセットを1つだけコピーする場合は、任意のサブフォルダーから呼び出すことができます。

1
jesseme

--relativeはセットアップが異なるため、私には機能しません。たぶん私は--relativeは動作しますが、

ssh remote mkdir -p /top/a/b/c
rsync /top/a/b/c/d remote:/top/a/b/c

理解しやすく、仕事をします。

1
andrej