當在 Linux 下對大量檔案執行 rm *、cp *、ls * 等指令時,常遇到 Argument list too long 錯誤。這是因為核心限制單一指令參數總長度(預設 128KB)。本文提供四種由淺入深的解決方案,適用不同場景。
利用 Shell 擴展字符分批:
mv [a-l]* ../target_dir/
mv [m-z]* ../target_dir/
缺點:需人工估算分批範圍,檔案量極大時需重複執行多次,不適合自動化腳本。
刪除範例:
find . -name "*.log" -type f -print0 | xargs -0 rm -f
複製範例:
find /src -type f -name "*.txt" -exec cp {} /dst/ \;
優點:單行指令、支援複雜過濾條件、自動處理參數分批。
缺點:需遍歷目錄樹,大量檔案時耗時較久。
#!/bin/bash
TARGET_DIR="/data/files"
cd "$TARGET_DIR" || exit 1
for f in *; do
[ -e "$f" ] || continue
rm -f "$f"
done
注意:若檔案名含空白或特殊字符,建議搭配 find -print0 | while IFS= read -r -d '' f 處理。
修改核心原始碼 include/linux/binfmts.h:
#define MAX_ARG_PAGES 64 /* 原為 32,對應 128KB -> 256KB */
重新編譯、安裝核心並重開機生效。
| 優點 | 風險 |
|---|---|
| 後續所有指令無參數長度限制 | 單一進程可佔用更多核心記憶體,多使用者系統易引發 OOM 或 DoS |
建議:僅在單一用途、記憶體充裕、經過完整壓力測試的專用伺服器上採用。
-print0 / -0 處理特殊檔名。