
私は scp を使用して、あるリモート サーバーから別のリモート サーバー上の新しいディレクトリ (名前を変更するだけ) にディレクトリをコピーしています。
scp -prq server1:dir1 server2:dir2
これは、server2 に dir2 が存在しない場合、正常に機能し、server1 の dir1 のすべてを含む dir2 という新しいディレクトリを作成します。
問題は、dir2 が server2 に既に存在する場合に発生します (注: これを事前に知る方法や、事前に server2 で dir2 を削除する方法はありません)。何が起こるかというと、dir1 のコピー (dir1 という名前) が dir2 に作成されるのです。
何か基本的なことが抜けているのは確かですが、どうも解決できないようです。
ご協力いただければ幸いです。
よろしくお願いいたします。
ジャイルズ
さて、私の評価は 10 未満で、8 時間も待つ気はないので、次の結果になりました:
私にとってうまく機能するスクリプトは次のとおりです:
#!/bin/sh
echo "method 1"
scp -prq server1:dir1/* server2:dir2/ >/dev/null 2>&1
if [ "$?" -ne "0" ]; then
echo "failed ... trying method 2"
scp -prq server1:dir1 server2:dir2
fi
exit
これを単一のコマンドで実行する方法、あるいは実行できるかどうかもまだわかりません。
@mindthemonkey さん、ありがとう。時には、新鮮な視点を得るだけで、道が開けることもあります。
答え1
次の「ドット」構文を使用します。
scp -prq server1:dir1/. server2:dir2/
これは、ディレクトリ自体ではなく、そのディレクトリの内容をコピーします。また、これは*
グロブよりも移植性が高いと考えています。
答え2
通常、ディレクトリの作成を制御するには、完全なパスを示す末尾を使用する必要があります/
が、ディレクトリが存在しない場合は、ディレクトリの作成に失敗すると思います。
scp -prq server1:dir1/* server2:dir2/
また、* globの展開により、隠し.ファイルが見つからない可能性もある(一部のシェル特有のトリッキーな作業)
ssh
とを使用して別のアプローチを取ることもできますtar
。
ssh server1 "cd dir1 && tar -cf - ." | ssh server2 "( mkdir -p dir2; cd dir2 && tar -xf - )"
ただし、これはトラフィックがローカル マシンを経由することを意味します。
答え3
まず ssh を使用して消去し、次に scp を使用して再作成します。つまり、スクリプト ファイルで再作成します...
ssh -i ~/.ssh/[private_key] user@server2 "rm -rf dir2; exit;"
scp -prq サーバー1:dir1 サーバー2:dir2
答え4
私もまったく同じ問題に頭を悩ませましたが、結局、半ばパントアウトすることにしました。つまり、dir2が の場合[STUFF]/parent/child2
、dir1の名前を変更するか、状況に応じてdir1をコピーまたはリンクして、server1のdir1_child2にコピーして、最後のパス要素も になるようにしchild2
、次に、
scp -prq server1:dir1_child2 server2:[STUFF]/parent
これは、child2 が dir2 の親ディレクトリに存在するかどうかに関係なく実行され、存在する場合は dir2 を置き換えます。