rm,cp,mv命令的参数列表太长错误

我在UNIX的一个目录下有几百个PDF文件。 PDF的名称非常长(约60个字符)。

当我尝试使用以下命令一起删除所有PDF时:

rm -f *.pdf

我收到以下错误:

/bin/rm: cannot execute [Argument list too long]

这个错误的解决方案是什么? 这个错误是否也发生在mvcp命令中? 如果是,如何解决这些命令?


发生这种情况的原因是因为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循环。

问题的根源

这是一个系统问题,与execveARG_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 {} +

参考

  • 我得到“参数列表太长”。 我如何处理一个大块的列表? @ wooledge
  • execve(2) - Linux手册页(搜索ARG_MAX);
  • 错误:参数列表太长了@ Debian的wiki;
  • 当通过引用的参数时,为什么我会得到“/ bin / sh:参数列表太长”? @超级用户

  • 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?