上一篇 下一篇 分享链接 返回 返回顶部

如何解决/bin/rm: cannot execute问题

发布人:Minchunlin 发布时间:2021-02-19 08:50 阅读量:1581

rm命令在Linux服务器中用来删除文件和目录。它可以通过指定每个文件名来删除几个文件,也可以使用-r参数(递归)来删除一个目录和它下面的整个目录树结构。

rm命令的语法是:

$ rm <file1> <file2> ... <fileN> 

$ rm -r <directory1> <directory2> ... <directoryN> <target_directory>

在Linux服务器中删除文件和目录

这些语法也可以结合起来一次性删除文件和目录。

$ rm -r file1 file2 file3 directory1 directory2

您也可以用通配符来指定文件和目录名称,如果名称相似,即开头、结尾或名称中包含相同的模式。当有大量相同文件扩展名的文件要被删除时,这一点特别有用。

例如,要删除所有文件名以字符串'file'开头的文件,我们可以运行。

$ rm file*

同样,要删除所有扩展名为'.txt'的文件,我们可以运行。

$ rm *.txt

通配符的作用是:将所有满足通配符模式的文件或目录作为 rm 的参数。因此理论上rm命令的参数数量没有限制。

删除大量文件时,"Argument list too long"参数列表太长

尽管理论上'rm'对参数的数量没有限制,但对单个命令可以使用的最大参数数量有一个预定义的限制。

这是在Linux系统中定义的限制,是基于系统的堆栈大小。因此,如果一个通配符模式将数以万计的文件或目录作为参数,程序会抛出一个错误。"Argument list too long"。

我这里以一个包含约2.5 lacs(250K)文件的文件夹为例。

$ ls -l | wc -l

$ ls | head

让我们试着用通配符来删除它们。

$ rm file*

此时会提示参数列表太长的错误。现在让我们看看如何解决这个错误。

解决方法:使用带有'-exec'参数的Find命令来删除成千上万的文件。

find命令基本上是根据不同的参数来搜索目录中的文件,比如文件名模式、文件扩展名等。

然后我们利用'find'的'-exec'参数,可以让你在find的输出上运行任何命令。

$ find . -maxdepth 1 -name "<filename_pattern>" -exec rm -r {} \;

其中,第一个参数'.'(当前目录)是查找文件的目录。如果要删除其他目录中的文件,则必须在此处指定该目录的路径。

参数'-maxdepth 1'仅考虑当前目录中的文件和目录。如果不指定,则find命令将不必要的浏览所有子目录。

参数"-name "用于查找带有字符串模式的文件和目录。filename_pattern'指定了字符串模式。然后我们在参数"-exec "后指定 "rm -r "命令。

括号'{ }'是参数的占位符,它将被用于find的输出。

下面是示例:

$ find . -maxdepth 1 -name "file*" -exec rm -r {} \;

我们可以看到,所有的文件都被删除了。同样的命令也可以用来批量删除目录,因为我们已经传递了'-r'参数。

在这篇文章中,我们学习了rm命令,以及如何通过使用'rm'结合'find'命令来处理'Argument list too long'参数列表太长的问题。

目录结构
全文