3

通常は scp を使用してコピーしますが、今はより強力な rsync コマンドに慣れようとしています。変更されたファイルのみをコピーすることで、帯域幅の使用を抑えることができます。ただし、rsync には多くの複雑なパラメーターがあるため、簡単に実行できるように簡単な Bash スクリプトを作成して、コマンド 'rscp' を呼び出してみようと思いました。それで、私はこのようなものを構築し始めました。以下の例では、私の Web ホストが 22 以外の別のポート番号を使用していることに注意してください。そのため、$1 が使用されています。

#!/bin/bash

rsync -avzp --progress --rsh='ssh -p$1' $2 $3 $4 $5 $6 $7

したがって、その使用法は次のようになると思いました。

rscp 3822 --exclude=tiny_mce /var/www/mysite/* root@webhost.com:~/www/mysite

そうすれば、私の scp コマンドの使用法に少し近づけることができます。

ただし、これを実行すると、次のエラーが発生します。

building file list ... 
4 files to consider
ERROR: destination must be a directory when copying more than 1 file
rsync error: errors selecting input/output files, dirs (code 3) at main.c(494) [receiver=2.6.9]
rsync: connection unexpectedly closed (8 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(454) [sender=2.6.9]

しかし、通常の rsync コマンドに戻ると、問題なく動作します。

Bashスクリプトで私が間違っていることを誰かが理解できますか?

4

2 に答える 2

7

/var/www/mysite/* はシェルによって展開されるため、スクリプトで処理するよりも多くの引数が渡されます。

また、変数は一重引用符で置換されないため、二重引用符を使用する必要があります。(bashの man ページを参照)

これを試して:

#!/bin/bash
PORT=$1
shift
rsync -avzp --progress --rsh="ssh -p$PORT" "$@"

最初に引数リストからポートを取り出し (shift を使用)、次に特別な "$@" を使用します。これは引数 (この場合はスクリプト) を参照し、それらすべてに変換されますが、それぞれ個別に変換されます。二重引用符で囲みます。(詳細については、bash のman ページを参照してください)。

于 2008-11-16T19:07:54.030 に答える
0

技術的にこれも関数に変えることはできませんか?:

    rscp() {
rsync -avzp --progress --rsh="ssh -p$PORT" "$@"
}

そして、それを実行すると: rscp 3822

于 2016-12-24T04:38:57.413 に答える