2017-06-09 79 views
1

使用scprsync時,我經常無法處理「參數列表太長」的錯誤。當必須mvrm,我沒有問題,使用findxargs,但我不明白如何使用find-exec儘管所有的SE帖子在主題上。考慮下面的問題......Bash:無法使用find -exec

我試圖

$scp /Path/to/B* [email protected]:/Path/to/ 

-bash: /usr/bin/scp: Argument list too long 

所以,我想

$find . -name "/Path/to/B*" -exec scp "{}" [email protected].152:/Path/to/ '\;' 

find: -exec: no terminating ";" or "+" 

所以我試圖

$find . -name "/Path/to/B*" -exec scp "{}" [email protected]:/Path/to/ ';' 

find: ./.gnupg: Permission denied 
find: ./.subversion/auth: Permission denied 

所以,我想

$sudo find . -name "/Path/to/B*" -exec scp "{}" [email protected]:/Path/to/ ';' 

並沒有發生onces輸入我的密碼

我在Mac OSX版本10.11.3,終端版本的更新之後2.6.1

+0

你爲什麼不復制目錄,而不是所有的文件呢? 「scp -r」會完成這項工作 – RaphaMex

+0

對不起,我選擇所有文件的例子很糟糕。我改變了這個例子,明確表示我不想複製所有的文件。我現在通常做的事情是,我找到'mkdir','find ... | xargs mv ..'文件,然後'scp -r'目錄,'mv'文件和'rm -r'目錄是相當愚蠢的。 –

回答

2

R. Saban's helpful answer解決您主要問題:

  • -name只接受文件名圖案,而不是一個路徑圖案。

  • 或者,您可以簡單地使用-path主要而不是-name主要。

作爲使用scp儘可能少的調用盡可能爲 - 其每一個都需要通過默認指定密碼:

  • 作爲替代方案,可考慮完全繞過使用scp,如建議在Eric Renouf's helpful answer

  • 雖然find-exec初級允許使用終止子+代替;(必須爲​​3210或\;被傳遞,以防止從解釋;作爲命令終止子)用於使盡可能多的文件名,如將適合在一個單一的命令行(內置的xargs,在說話的方式),這不是一個選項在這裏,因爲使用+要求佔位符{}來命令行上上一個,緊接在+之前。

  • 但是,因爲你在MacOS,您可以使用BSD xarg的非標準-J選項在命令行上放置佔位任何地方,同時還傳遞儘可能多的參數儘可能在一次(使用BSD find小號非標準-0選項的與xargs組合非標準-print0選項「,確保所有文件名都原封不動的使用,即使他們有嵌入的空格,例如):

find . -path "/Path/to/B*" -print0 | xargs -0 -J {} scp {} [email protected]:/Path/to/ 

現在您最多隻會提示一個幾個次:每個參數的一個提示符,以適應所有參數,同時觀察最大值。可能的調用數最少的命令行長度。

2

編輯:

find "/Path/to" -maxdepth 1 -name "B*" -exec scp {} [email protected]:/Path/to/ \; 
+0

哦......我很傻。只是不得不把整個路徑放在名稱中。我現在必須在每個文件中輸入我的密碼。你碰巧也有解決方案嗎? –

+0

你可以接受這個答案,併爲你的新問題打開另一個;) – RaphaMex

0

一個解決方案,止跌」 t需要多個scp連接(因此密碼輸入)將在一側焦油並且在另一側焦油:

find /Path/to -maxdepth 1 -name 'B*' -print0 | tar -c --null -T - | ssh [email protected] tar -x -C /Path/to 

假設你的find版本支持-print0等等。它通過從find打印空終止的列表並告知tar從stdin(-T -)讀取其列表(-T -)將列表視爲空終止(--null)並創建新歸檔(-c))。默認情況下,tar將寫入標準輸出。

那麼我們會將該存檔傳遞給目標主機的ssh命令。這將讀取其標準輸入上一個命令的輸出,所以我們將使用tar那裏提取物(-x)歸檔到指定目錄(-C /Path/to