私が実行すると、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つの方法は、途中でシェルを使用することです。これはxargs
orを使用したときに引数を並べ替える一般的な技術です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:~/