刪除大量檔案Argument list too long錯誤解決

pythontab發表於2018-11-02

問題復現

最近發現一個問題, 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 這個神奇的命令。


相關文章