使用 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:~/
但它不起作用。執行此操作的正確命令是什麼?
謝謝!
嘗試這個。應該適用於最新版本的 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 主連接來大大縮短每次連接的時間(這超出了此答案的範圍,請參閱手冊,尤其是 中的ControlMaster
和ControlPath
選項.ssh/config
)。強制參數位於正確位置的一種方法是通過中間外殼。這是使用
xargs
or時重新排序參數的一般技術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:~/