問題復現
最近發現一個問題, Linux下一個目錄下的檔案過多檔案的話,如果想要刪除檔案系統就會提示Argument list too long,
比如我的某個資料夾下有900000(只是舉個例子,大多數情況下是沒有這麼多的)個檔案是以 test 開頭的,想要刪除它們怎麼辦呢?
通常我們首先想到用rf -f test*命令, 但是。。。我們來看下結果吧
rf -f test*
結果報錯
Argument list too long
問題分析
這是Linux的shell引數個數限制,該錯誤表示執行命令的引數太長,超過系統允許的最大值。
這個值透過ARG_MAX變數獲取,命令如下:
getconf ARG_MAX
結果:
131072
這個數值不同機器上的設定可能不同, 和系統也有關係。
問題解決
可以使用兩種方法解決:
1. 修改ARG_MAX的值,這個值是沒辦法直接修改的,需要重新編譯Linux核心,手動增加核心中分配給命令列引數的頁數,
開啟kernel source下面的include/linux/binfmts.h檔案,找到如下行:
# define MAX_ARG_PAGES 32
將”32“改為更大的值,例如64或128,然後重新編譯核心。
此種方法永久有效,可以徹底解決問題,但是比較複雜,推薦給高階使用者使用,沒有Linux經驗的使用者不建議用這種方法。
2. 使用xargs 命令
xargs命令通俗來講就是將標準輸入轉成各種格式化的引數,所以命令[command 1] | xargs [command 2]就是將command 1的標準輸出結果,透過管道|變成xargs的標準輸入,然後xargs再將此標準輸入變成引數,傳給[command 2]。這樣一來,透過xargs命令,我們便可以在管道後面使用那些不接收標準輸入的命令了。
執行:
ls | grep test* |xargs rm -f #就能全部刪除了
為什麼 xargs 就能執行成功, 是因為 xargs 會把引數分批傳遞給 rm , 這樣的話就沒有了引數超限的問題了。
抽空我會再寫一篇關於 xargs 的文章, 咱們來共同學習下 xargs 這個神奇的命令。