Xargs
xargs 行太長
我正在嘗試刪除前兩位數字中包含十六進制數字的所有文件,因此我使用以下表達式:
ls | grep -Z '^[0-9a-f][0-9a-f]' | xargs -0 rm
但是,終端輸出錯誤:
xargs: argument line too long
為了仔細檢查,我跑了:
ls | grep -Z '^[0-9a-f][0-9a-f]'
它輸出我要刪除的所有文件。
為什麼我會收到此錯誤?另外,我怎樣才能刪除這些文件?
此外,我的文件名類似於以下內容:
ffc1abfa3149067e990620dbecfa96d325fbbd ffcc72282168e33110ecf436e2726a5f901ca6 ffd010299a02ded0a8d41ee1ccc242f2193df2 ffd27295acbe3d35088a5a754f5593eac6a0ae ffd332a39f7be05d58863fe3bf55d7aba68b69 ffd7ba85b0577b90c0fb1b3922303c486127d4 ffdb37718feaf64c404a6c2a3648f15cdf27b1 ffdbffe5b187c8a73d15da9e5f6cc0fb8d4df3 ffdd8c340650848759c7e59f90f8c112ac33ce ffde57cb4ba9b69531a3b3f2c6588d2802f71b ffdeb529353a85b642efa1404aa27e58982da1 ffe0bec99e3e64c61dd45e404c8ccf12d7bea5 ffe58837e9d976499781de17628f2f41e16c9a ffee6887889924583762e43d5a6b9cd29b6690 fff0b6886aff6cb4073742fbf7bcc1b47d9b45
也許文件名本身太長了
xargs
?
-Z
是在每個文件名之後輸出一個 NULgrep -l
,而不是在它輸出的行中將換行符更改為 NUL。所以xargs -0
只看到一個巨大的記錄(其中有幾個換行符),因為沒有 NUL 分隔,所以這只是一個要傳遞的參數rm
,它可能大於參數的最大大小(Linux 上為 128kB),反正沒有這樣的文件名為...ffd7ba85b0577b90c0fb1b3922303c486127d4<newline>...fff0b6886aff6cb4073742fbf7bcc1b47d9b45
.只需這樣做:
rm [0-9a-f][0-9a-f]*
或者如果列表太大:
printf '%s\0' [0-9a-f][0-9a-f]* | xargs -r0 rm
或與
zsh
:autoload zargs # best in ~/.zshrc setopt extendedglob # ditto zargs [0-9a-f](#c2)* -- rm
或與
ksh93
:command -x rm {2}([0-9a-f])*
或者:
find . ! -name . -prune -name '[0-9a-f][0-9a-f]*' -exec rm {} +
請注意,在非 C 語言環境
[a-f]
中匹配的可能不止[abcdef]
.