回答:
これを試して。xargsの最新バージョンで動作するはずです。
svn st | awk '{print $2}' | xargs -iz scp z my_name@my_server:
または、ファイルをループすることもできます。
for file in $(svn st | awk '{print $2}'); do scp $file my_name@my_server: ; done
-Iz
ません-iz
-iz
Solarisで使用していますが、常に機能します。ポインタをありがとう。
-i
Solaris 2.5以降使用しています。私の友達、年をとることは悲しい出来事です。:)
これが機能しない理由は、xargs
実行するように指示しているためです
scp my_name@my_server:~/ a.py b.py c.py
引数の順序が、実行したいことと一致していません。1つの解決策は、コマンドラインで宛先の前にファイル名を表示させることです。これにはGNU xargs(つまり、LinuxまたはCygwin)が必要です。そこにいる間-d '\n'
、改行を含まないファイル名が機能することを確認するために渡すことができます(-d
xargsがなければ、xargsは入力の奇妙な引用を期待しています)。ファイル名がなだらかになりがちな一般的なソフトウェアソースツリーで作業する場合、これは必要ありません。
svn st | awk '{print $2}' |
xargs -d\\n -I{} scp {} my_name@my_server:~/
このメソッドの欠点は、scp
ファイルごとに個別に呼び出されることです。小さなファイルをたくさんコピーする場合、SSH接続が確立するのに少し時間がかかるため、大きな違いが生じる可能性があります。SSHマスター接続を使用すると、接続ごとの時間を大幅に短縮できます(これはこの回答の範囲を超えています。マニュアル、特にControlMaster
とのControlPath
オプションを参照してください.ssh/config
)。
引数を強制的に正しい場所に置く方法は、中間シェルを経由することです。これは、xargs
またはを使用するときに引数を並べ替える一般的な手法find … -exec
です。
svn st | awk '{print $2}' |
xargs -d\\n sh -c 'scp "$@" "$0" my_name@my_server:~/
のrsync
代わりにを使用することもできscp
ます。rsync
標準入力でファイル名のリストを渡すことができます。rsync
は、ファイル名のリストではなくパターンのリストを想定しているため、ファイル名にワイルドカード文字(具体的には、改行なし\[*?
、イニシャルなし、イニシャル#
または;
)が含まれていないことが必要です。
svn st | awk '{print $2}' |
rsync -a --include-from=- --exclude='*' . my_name@my_server:~/
svn st | awk '{print $2}' | xargs -J % scp % my_name@my_server:~/
xargs