首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xargs线太长

xargs线太长
EN

Unix & Linux用户
提问于 2014-08-18 19:04:13
回答 4查看 5.6K关注 0票数 1

我试图删除前两个数字中有十六进制数字的所有文件,因此我使用以下表达式:

代码语言:javascript
复制
ls | grep -Z '^[0-9a-f][0-9a-f]' | xargs -0 rm

但是,终端输出错误:

代码语言:javascript
复制
xargs: argument line too long

再查一遍,我跑了:

代码语言:javascript
复制
ls | grep -Z '^[0-9a-f][0-9a-f]' 

它输出我要删除的所有文件。

我为什么要犯这个错误?此外,如何删除这些文件?

另外,我的文件名类似于以下内容:

代码语言:javascript
复制
ffc1abfa3149067e990620dbecfa96d325fbbd
ffcc72282168e33110ecf436e2726a5f901ca6
ffd010299a02ded0a8d41ee1ccc242f2193df2
ffd27295acbe3d35088a5a754f5593eac6a0ae
ffd332a39f7be05d58863fe3bf55d7aba68b69
ffd7ba85b0577b90c0fb1b3922303c486127d4
ffdb37718feaf64c404a6c2a3648f15cdf27b1
ffdbffe5b187c8a73d15da9e5f6cc0fb8d4df3
ffdd8c340650848759c7e59f90f8c112ac33ce
ffde57cb4ba9b69531a3b3f2c6588d2802f71b
ffdeb529353a85b642efa1404aa27e58982da1
ffe0bec99e3e64c61dd45e404c8ccf12d7bea5
ffe58837e9d976499781de17628f2f41e16c9a
ffee6887889924583762e43d5a6b9cd29b6690
fff0b6886aff6cb4073742fbf7bcc1b47d9b45

也许文件名本身对xargs来说太长了?

EN

回答 4

Unix & Linux用户

回答已采纳

发布于 2014-08-18 19:16:01

-Z是在带有grep -l的每个文件名之后输出一个NUL,而不是在其输出的行中将换行符更改为NULs。因此,xargs -0只看到一个巨大的记录(其中包含几个换行符),因为没有NUL分隔,所以这只是传递给rm的一个参数,它可能比参数的最大大小(在Linux上为128 on )要大,而且无论如何也没有这样的文件名为...ffd7ba85b0577b90c0fb1b3922303c486127d4<newline>...fff0b6886aff6cb4073742fbf7bcc1b47d9b45

只需做:

代码语言:javascript
复制
rm [0-9a-f][0-9a-f]*

或者如果清单太大:

代码语言:javascript
复制
printf '%s\0' [0-9a-f][0-9a-f]* | xargs -r0 rm

或者使用zsh

代码语言:javascript
复制
autoload zargs        # best in ~/.zshrc
setopt extendedglob   # ditto

zargs [0-9a-f](#c2)* -- rm

或者使用ksh93

代码语言:javascript
复制
command -x rm {2}([0-9a-f])*

或者:

代码语言:javascript
复制
find . ! -name . -prune -name '[0-9a-f][0-9a-f]*' -exec rm {} +

请注意,在非C语言环境中,[a-f]可能比[abcdef]更匹配。

票数 6
EN

Unix & Linux用户

发布于 2014-08-18 21:36:02

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

代码语言:javascript
复制
 find . -name '^[0-9a-f][0-9a-f]' -print0 | xargs -0 rm

或者另一种选择

代码语言:javascript
复制
 find . -name '^[0-9a-f][0-9a-f]' -exec rm {} \;
票数 0
EN

Unix & Linux用户

发布于 2015-04-24 15:23:25

你最好还是直接去找。像find -type f -iname '[0-9a-f][0-9a-f]*' -delete这样的人应该这么做。当然,首先尝试使用-print而不是-delete来确定。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/150839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档