xargsを使用してscpにパラメーターを提供する


10

を実行するとsvn st | awk '{print $2}'、次のようになります。

a.py
b.py
c.py

次に、scpこれらのファイルをリモートサーバーに配置します。私が試してみました:

svn st | awk '{print $2}' | xargs scp my_name@my_server:~/

しかし、それは機能しません。これを行うための正しいコマンドは何ですか?

ありがとうございました!

回答:


10

これを試して。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


2
ティムありがとう。私はたくさんsvn st | awk '{print $2}' | xargs -J % scp % my_name@my_server:~/xargs
ググって

そしてあなたの解決策もうまくいきます!しかし、タイプミスがあります、それはあり-Izません-iz
mitnk

どのOSを使用していますか?-izSolarisで使用していますが、常に機能します。ポインタをありがとう。
ティムケネディ

4
POSIX xargsにはがあり-Iます。AIX(6.1)のmanページには-i、廃止-Iされたため使用する必要があるとあります。Solaris 10(および9)にはとの両方が-iあり-Iます。
マット

1
ああ、私の知識は時代遅れです!-iSolaris 2.5以降使用しています。私の友達、年をとることは悲しい出来事です。:)
ティム・ケネディ

4

これが機能しない理由は、xargs実行するように指示しているためです

scp my_name@my_server:~/ a.py b.py c.py

引数の順序が、実行したいことと一致していません。1つの解決策は、コマンドラインで宛先の前にファイル名を表示させることです。これにはGNU xargs(つまり、LinuxまたはCygwin)が必要です。そこにいる間-d '\n'、改行を含まないファイル名が機能することを確認するために渡すことができます(-dxargsがなければ、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:~/
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.