web-dev-qa-db-ja.com

scpを常に上書きするか、ディレクトリを作成する

Scpを使用して、あるリモートサーバーから別のリモートサーバー上の新しいディレクトリ(つまり、名前を変更するだけ)にディレクトリをコピーします。

scp -prq server1:dir1 server2:dir2

これは、dir2がserver2に存在しない場合に正常に機能し、server1のdir1からのすべてを含むdir2という新しいディレクトリを作成します。

問題は、dir2がserver2に既に存在する場合に発生します(注:これを事前に知る方法も、前もってserver2の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よろしくお願いします。時々、新鮮な視点を得るだけで道を示すことができます。

29
Giles

次の「ドット」構文を使用します。

scp -prq server1:dir1/. server2:dir2/

これにより、ディレクトリ自体ではなく、そのディレクトリの内容がコピーされます。そして、私はそれが*グロビング。

37
chronospoon

通常、ディレクトリの作成を制御するには、末尾の/を使用して完全なパスを示す必要がありますが、ディレクトリが存在しない場合は作成できません。

scp -prq server1:dir1/* server2:dir2/

これも隠されたものを見逃す可能性があります。 * glob展開によるファイル(一部の トリッキーシェル固有の作業なし なし)

sshtarを使用すると、異なる方法でアプローチできます。

ssh server1 "cd dir1 && tar -cf - ." | ssh server2 "( mkdir -p dir2; cd dir2 && tar -xf - )"

しかし、これはトラフィックがローカルマシンを経由することを意味します。

1
Matt