リモート側で不足している親ディレクトリを作成するrsync
のようなプログラムを探しています。
たとえば、1つのサーバーに/top/a/b/c/d
があり、リモートサーバーに/top/a
のみが存在する場合、d
をリモートサーバーにコピーし、b
c
ディレクトリも作成されます。
コマンド:
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
のみをコピーします。 (注-包含は除外の前になければなりません。)
他のオプションはありますか?
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実行可能ファイルのパスを設定できます。
手動で存在を強制することをお勧めします。
ssh user@remote mkdir -p /top/a/b/c
rsync /top/a/b/c/d remote:/top/a/b/c
これにより、ターゲットフォルダーが存在しない場合は作成されます。
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
より良いソリューションを探していましたが、サブディレクトリが多すぎて手動で作成できない場合は、私のほうが適しているようです。
--parents
オプションの中間ステップとしてcp
を使用するだけです
cp --parents /your/path/sub/dir/ /tmp/localcopy
rsync [options] /tmp/localcopy/* remote:/destination/path/
cp --parents
は構造を作成します。
親フォルダーのサブセットを1つだけコピーする場合は、任意のサブフォルダーから呼び出すことができます。
--relative
はセットアップが異なるため、私には機能しません。たぶん私は--relative
は動作しますが、
ssh remote mkdir -p /top/a/b/c
rsync /top/a/b/c/d remote:/top/a/b/c
理解しやすく、仕事をします。