Scp

使用 xargs 向 scp 提供參數

  • November 19, 2011

當我執行時svn st | awk '{print $2}',我得到:

a.py
b.py
c.py

然後我想把scp這些文件傳到遠端伺服器上。我努力了:

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

但它不起作用。執行此操作的正確命令是什麼?

謝謝!

嘗試這個。應該適用於最新版本的 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

這不起作用的原因是你告訴xargs執行

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

參數的順序與您想要做的不對應。一種解決方案是強製文件名出現在命令行上的目標之前。這需要 GNU xargs(即 Linux 或 Cygwin)。當我們這樣做時,我們可以通過-d '\n'以確保任何不包含換行符的文件名都可以工作(沒有-d, xargs 期望對其輸入進行一些奇怪的引用);如果您使用典型的軟體原始碼樹,則不需要這樣做,其中文件名往往非常平淡。

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

這種方法的缺點是scp每個文件都單獨呼叫。如果您要複製大量小文件,則可能會產生重大影響,因為建立 SSH 連接需要一些時間。您可以通過使用 SSH 主連接來大大縮短每次連接的時間(這超出了此答案的範圍,請參閱手冊,尤其是 中的ControlMasterControlPath選項.ssh/config)。

強制參數位於正確位置的一種方法是通過中間外殼。這是使用xargsor時重新排序參數的一般技術find … -exec

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

另一種可能性是使用rsync而不是scp. 您可以在標準輸入上傳遞rsync文件名列表。由於rsync需要模式列表而不是文件名列表,因此這要求您的文件名不包含任何萬用字元(特別是,沒有換行符,沒有\[*?和沒有首字母#or ;)。

svn st | awk '{print $2}' |
rsync -a --include-from=- --exclude='*' . my_name@my_server:~/

引用自:https://unix.stackexchange.com/questions/24846