rm,cp,mv命令的参数列表太长错误
我在UNIX的一个目录下有几百个PDF文件。 PDF的名称非常长(约60个字符)。
当我尝试使用以下命令一起删除所有PDF时:
rm -f *.pdf
我收到以下错误:
/bin/rm: cannot execute [Argument list too long]
这个错误的解决方案是什么? 这个错误是否也发生在mv
和cp
命令中? 如果是,如何解决这些命令?
发生这种情况的原因是因为bash实际上将星号扩展为每个匹配的文件,从而产生一个非常长的命令行。
尝试这个:
find . -name "*.pdf" -print0 | xargs -0 rm
警告:这是一个递归搜索,并且也会在子目录中查找(和删除)文件。 只有在确定不需要确认的情况下,才可以将-f
命令用于rm命令。
您可以执行以下操作以使命令不递归:
find . -maxdepth 1 -name "*.pdf" -print0 | xargs -0 rm
另一种选择是使用find的-delete
标志:
find . -name "*.pdf" -delete
TL;博士
这是对命令行参数大小的内核限制。 改用for
循环。
问题的根源
这是一个系统问题,与execve
和ARG_MAX
常量有关。 有很多关于这方面的文档(请参阅man execve,debian的wiki)。
基本上,扩展会生成一个超出ARG_MAX
限制的命令(使用其参数)。 在内核2.6.23
,限制设置为128 kB
。 此常数已增加,您可以通过执行以下操作来获得其值:
getconf ARG_MAX
# 2097152 # on 3.5.0-40-generic
解
在BashFAQ / 095上推荐使用for
循环,除了RAM /内存空间之外没有限制:
for f in *.pdf; do rm "$f"; done
此外,这是一种可移植的方法,因为glob在shell之间具有强大且一致的行为(POSIX规范的一部分)。
如果你坚持,你可以使用find
但实际上不使用xargs,因为它在读取非NUL分隔的输入时是危险的(破坏,可被利用等):“
find . -name '*.pdf' -exec rm {} +
参考
find
有一个-delete
行为:
find . -maxdepth 1 -name '*.pdf' -delete
链接地址: http://www.djcxy.com/p/97119.html
上一篇: Argument list too long error for rm, cp, mv commands
下一篇: How to use Bash to create a folder if it doesn't already exist?