xargsを使用してscpに引数を提供する

xargsを使用してscpに引数を提供する

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

a.py
b.py
c.py

scpその後、このファイルをリモートサーバーに送信したいと思います。私は試した:

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

しかし、これはうまくいきません。これを行う正しいコマンドは何ですか?

ありがとうございます!

答え1

この試み。最新バージョンの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

これがうまくいかないのは、xargs実行するように命令するからです。

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

パラメーターの順序が目的の操作と一致しません。 1つの解決策は、コマンドラインでターゲットの前にファイル名を表示させることです。これにはGNU xargs(LinuxやCygwinなど)が必要です。これを行うときに-d '\n'一般的な-dソフトウェアソースツリー(ファイル名が非常に穏やかな傾向がある)これを行う必要はありません。

svn st | awk '{print $2}' |
xargs -d\\n -I{} scp {} my_name@my_server:~/

この方法の欠点は、scp各ファイルに対して個別に呼び出されることです。 SSH接続を確立するのに時間がかかるため、小さなファイルをたくさんコピーする場合、これは大きな影響を与える可能性があります。 SSHマスター接続を使用すると、接続あたりの時間を大幅に短縮できます(この回答の範囲外です。マニュアル、特にControlMasterオプションControlPathを参照してください.ssh/config)。

パラメータを正しい位置に強制的に配置する1つの方法は、途中でシェルを使用することです。これはxargsorを使用したときに引数を並べ替える一般的な技術です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:~/

関連情報