1. 程式人生 > >四種解決Argument list too long的辦法[轉載]

四種解決Argument list too long的辦法[轉載]

轉載【四種解決”Argument list too long”引數列表過長的辦法

[[email protected] foo]$ mv * ../foo2

bash: /bin/mv: Argument list too long


“Argument list too long”引數列表過長錯誤經常發生在使用者在一行簡單命令中提供了過多的引數而導致,經常在ls *, cp *, rm * 等中出現。
根據問題的原因以下提供了四種方法,可以根據自己的情況酌情選用

方法1 : 將檔案群手動劃分為比較小的組合

e.g 1:

[[email protected] foo]$ mv [a-l]* ../foo2

[[email protected] foo]$ mv [m-z]* ../foo2


這是最基本的方法,只是簡單的使引數數量符合要求,這種方法應用範圍有限,只適用於檔案列表中的名字分佈比較均勻,另外這也是個初級使用者可以考慮的解決方案,不過需要很多重複命令和對檔名分佈的觀察與猜測。

 

方法2 : 使用find命令

e.g 2:

[[email protected] foo]$ find $foo -type f -name '*' -exec mv {}$foo2/. \;

方法2通過find命令,將檔案清單輸出到mv命令,使其一次處理一個,這樣就完全避免了過量引數的存在,另外通過不同的引數,可以指定除了名稱以外的時間戳,許可權,以及inode等匹配模式。
方法2的缺點在於比較耗費時間。

 

方法3 : 建立shell函式

e.g 3.1:

function huge_mv ()

{whileread line1; do
mv foo/$line1 ../foo2
done
}
ls -1 foo/ | huge_mv

寫一個shell函式並不涉及到某種程度的複雜性, 這種方法比方法1和方法2相比更加靈活。
下面我們來擴充套件一下例3.1 :
e.g 3.2:

 

function huge_mv ()
{whileread line1; do
md5sum foo/$line1 >> ~/md5sums
ls -l foo/$line1 >> ~/backup_list
mv foo/$line1 ../foo2
done
}
ls -1 foo/ | huge_mv

相比例3.1,例3.2生成了檔案的md校驗雜湊檔案和名字備份,符合給自己留條後路的哲學。
另外可以根據自己的需要無限制的擴充套件功能。

 

方法4 : 終極解決方案,重新編譯核心

首先使用這個方案之前要謹慎,因為涉及到修改核心原始碼,在生產環境中還是要斟酌一下並做好測試。
另外,這個方法是從根本上解決的,一勞永逸的 
這也是開放原始碼的好處之一 
首先在核心原始碼中找到 include/linux/binfmts.h檔案 ,搜尋到以下欄位:
/*
* MAX_ARG_PAGES defines the number of pages allocated for arguments
* and envelope for the new program. 32 should suffice, this gives
* a maximum env+arg of 128kB w/4KB pages!
*/
#define MAX_ARG_PAGES 32

修改 MAX_ARG_PAGES數值為 64 或者更高即可完善的解決引數受限問題。
然後 重新編譯並啟用新核心即可。