
ローカルファイル構造があります。
/tmp/24
/dir1
/file1
/file2
/dir2
/file3
/file4
リモートコンピューティングにアップロードしたい。私が使うとき
rsync /tmp/24 host:/target
リモートホスト(、...)target
のディレクトリ内に作成されます。/target/24/dir1/file1
しかし、私はこのように使っています。
rsync /tmp/24/ host:/target
私が望むことを行います。つまり、次のように作成します/target/dir1/file1
。ただし、ターゲットフォルダがすでに存在する場合は、パスで終わるかどうかscp
にかかわらず最初のエントリが実行され、ターゲットフォルダが存在しない場合は2番目のエントリが実行されます。/
2番目の例のように動作させるにはどうすればよいですかscp
?rsync
答え1
ソースディレクトリ名の後の「/」はrsyncの微妙です。それに注意を払ってください。
同期
ソースファイルの末尾にあるスラッシュは実際に「コピー」を意味します。コンテンツディレクトリ自体ではなく、そのディレクトリのディレクトリです。」末尾のスラッシュがない場合は、「ディレクトリのコピー」を意味します。
それではrsync -a tmp/24/ host:/target
コピーになります。コンテンツ「host:/target/…」に「/tmp/24/」を書き込みます。
しかし、rsync -a tmp/24 host:/target
コピーします。目次「/tmp/24/」(およびその内容)を「host:/target/24/...」に変換します。
"host:/target/" がまだ存在していなくても構いません。必要に応じて生成され、結果はどちらも同じです。
(対象の末尾のスラッシュは重要ではありません。)
┌─────────────────────────┬───────────────┬───────────────────────┐
│ rsync │ target exists │ target does not exist │
├─────────────────────────┼───────────────┼───────────────────────┤
│ rsync -a tmp/24 target │ target/24/… │ target/24/… │
├─────────────────────────┼───────────────┼───────────────────────┤
│ rsync -a tmp/24/ target │ target/… │ target/… │
└─────────────────────────┴───────────────┴───────────────────────┘
SCP
スラッシュはまったく重要ではなく、ターゲットディレクトリが存在する点だけが異なります。ソースディレクトリがある場合はコピーしてください。入力する宛先ディレクトリ。それ以外の場合、ターゲットディレクトリはソースディレクトリのレプリカとして作成されます。
┌───────────────────────┬───────────────┬───────────────────────┐
│ scp │ target exists │ target does not exist │
├───────────────────────┼───────────────┼───────────────────────┤
│ scp -r tmp/24 target │ target/24/… │ target/… │
├───────────────────────┼───────────────┼───────────────────────┤
│ scp -r tmp/24/ target │ target/24/… │ target/… │
└───────────────────────┴───────────────┴───────────────────────┘
したがって、あなたは正しいです。まずこれを行う必要があり、ssh host mkdir -p /target
次の動作はrsyncと同じです。
しかし、なぜrsyncを使用しないのですか?部分転送、中断転送、圧縮データなど、より多くのタスクを実行できます。
rsync -azu tmp/24 host:/target
CP
完全性のために:Macでは、ターゲットがすでに存在する限り、末尾の「/」はrsyncセマンティクスを提供します。
┌──────────────────────┬───────────────┬───────────────────────┐
│ cp (Mac) │ target exists │ target does not exist │
├──────────────────────┼───────────────┼───────────────────────┤
│ cp -a tmp/24 target │ target/24/… │ target/… │
├──────────────────────┼───────────────┼───────────────────────┤
│ cp -a tmp/24/ target │ target/… │ target/… │
└──────────────────────┴───────────────┴───────────────────────┘
Linuxでは、scpと同様に、スラッシュはまったく重要ではありません。
┌──────────────────────┬───────────────┬───────────────────────┐
│ cp (Linux) │ target exists │ target does not exist │
├──────────────────────┼───────────────┼───────────────────────┤
│ cp -a tmp/24 target │ target/24/… │ target/… │
├──────────────────────┼───────────────┼───────────────────────┤
│ cp -a tmp/24/ target │ target/24/… │ target/… │
└──────────────────────┴───────────────┴───────────────────────┘
同じ上記と
追加... ditto(1) は、ディレクトリ複製のための Mac OS ツールです。できるだけ正確にコピーされます。
スラッシュはまったく重要ではありません。宛先ディレクトリがすでに存在するかどうかは重要ではありません。
┌──────────────────────┬──────────┐
│ ditto tmp/24 target │ target/… │
└──────────────────────┴──────────┘
ターゲットがすでに存在する場合は、既存のファイルを無条件に上書きします。ソースにないファイルはターゲットに保持されます。
答え2
ハハ、私の問題は次のように解決することができます。
ssh host "mkdir -p /target"
scp tmp/24/* host:/target