2010-11-15 104 views
23

我最近一直在複製和移動大量文件(〜400,000)。我知道可以在Bash命令行上擴展的參數數量有限制,所以我一直使用xargs來限制生成的數字。最大數量的Bash參數!=最大數量cp參數?

出於好奇,我想知道的,我可以用參數的最大數量是,我發現this post稱這是系統相關的,而且我可以運行此命令找出:

$ getconf ARG_MAX 

令我驚訝的是,我回來了anwser是:

2621440 

就在260萬。正如我所說的,我正在操作的文件數量遠遠低於這個數字 - 約爲400k。我肯定需要使用xargs移動和複製這些文件的方法,因爲我嘗試使用正常的mv * ...cp * ...,並且得到'參數列表太長'的錯誤。

所以,做mvcp命令對的,我可以使用(我無法找到它們的手冊頁的任何東西)的參數個數自己固定的限制,還是我失去了一些東西?

+0

爲什麼你必須指定每個文件?你不能只是指定他們的目錄或類似的東西? – 2010-11-15 14:02:34

+0

@Christoffer我不只是將目錄從一個地方複製到另一個地方,我正在複製特定文件,重命名文件串,將某些文件從一個地方移動到另一個地方。我在實際執行這些操作時沒有問題。我只是對'cp'和'mv'命令的具體侷限性感到好奇。 – 2010-11-15 14:14:11

回答

23

正如伊格納西奧說,ARG_MAX是傳遞給exec()參數的緩衝器的最大長度,而不是文件的最大數量(this page具有非常深入的解釋)。具體來說,它列出fs/exec.c如檢查以下條件:

PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *)/sizeof(void *) 

而且,看來,你有一些額外的限制:

在32位Linux,這是ARGMAX/4-1 (32767)。如果參數的平均長度小於4,則這變得相關。 從Linux 2.6.23開始,此函數測試<linux/binfmts.h>(2^32-1 = 4294967296-1)中的數字是否超過MAX_ARG_STRINGS。 作爲附加限制,一個參數不能超過MAX_ARG_STRLEN(131072)。

6

ARG_MAX是參數exec(3)函數的最大長度。一個shell不需要支持從命令行傳遞這個長度的參數。

+0

但bash不強制_any_限制,說[this](http://www.in-ulm.de/~mascheck/various/argmax/);如果參數列表太長,它只會嘗試執行'exec'並傳遞操作系統錯誤。 – alexis 2014-01-20 12:54:19