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

答案1

-Z是在每个带有 的文件名后输出一个 NUL grep -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].

答案2

我建议将您选择的命令更改为:

 find . -name '^[0-9a-f][0-9a-f]' -print0 | xargs -0 rm

或另一种选择

 find . -name '^[0-9a-f][0-9a-f]' -exec rm {} \;

答案3

你最好使用 just find 。类似的事情find -type f -iname '[0-9a-f][0-9a-f]*' -delete应该做。当然,首先尝试使用 -print 而不是 -delete 来确定。

答案4

根据您的文件系统类型,您可能会遇到文件名限制。看:

http://en.m.wikipedia.org/wiki/Comparison_of_file_systems

具体来说,“限制”部分

如果您不知道文件系统类型,可以使用以下命令检查它:

$ cat /etc/fstab

相关内容