昨天升級 Email Server 的 SquirrelMail,當我將舊版本 SquirrelMail 下面的 data 目錄資料複製到新版本時,出現了 "Argument list too long",然後找了找,發現原來在 Linux 下用 cp, mv, rm 這些指令時,如果輸入的檔案數目太多會出現 "Argument list too long" 錯誤。
因為在 Linux Kernel 內對 command-line arguments 限製了記億體的使用,就例如在一個目錄下有很多檔案,如果用 "cp * /home/user/",那便會出現這個問題,以下列出兩個解決辦法:
1. 分開多個指令執行: 可以將檔案分成幾個指令執行,例如:
cp [0-9]* /path/to/
cp [a-l]* /path/to/
cp [m-z]* /path/to/
2. 使用 find 指令: 另一個方法是用 find 指令,可以一句便完成:
find /file_from/* -type f -name ‘*’ -exec cp {} /path/to/. \;
以上指令會將 /file_from/ 目錄下的所有檔案覆製到 /path/to/ 下面。
P.S. 如果想修改 kernel 以解決問題,可以開啟在 kernel source 下面的 include/linux/binfmts.h 檔案,在開頭的位置裡面有一行 "#define MAX_ARG_PAGES 32",將 32 改成更大的數值,例如 64 或 128,然後重新編譯 kernel。
[…] “Argument list too long” 問題 (tags: Tech OS UNIX Tips) […]
Pingback by -TMA-1- » Blog Archive » links for 2006-03-19 — March 20, 2006 @ 11:16 pm
[…] 參考網站: 1.Real-Blog - Argument list too long 問題 2.4wei-diary - Argument list too long […]
Pingback by GongDa’s Blog » Argument list too long 問題 — May 20, 2006 @ 9:11 pm