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

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

rm -f *.pdf

我收到以下错误:

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

此错误的解决方案是什么?mv和cp命令是否也会出现此错误?如果是,如何解决这些命令?


当前回答

如果要同时删除文件和目录,可以使用以下命令:

echo /path/* | xargs rm -rf

其他回答

还有一个:

cd  /path/to/pdf
printf "%s\0" *.[Pp][Dd][Ff] | xargs -0 rm

printf是一个内置的shell,据我所知,它一直都是这样的。既然printf不是一个shell命令(而是一个内置命令),它就不会出现“参数列表太长…”致命错误。

因此,我们可以安全地将其与*等shell globbing模式一起使用。[Pp][Dd][Ff],然后我们通过xargs将其输出通过管道传输到remove(rm)命令,这确保它在命令行中适合足够的文件名,以免rm命令(shell命令)失败。

printf中的\0用作文件名的空分隔符,然后由xargs命令处理,使用它(-0)作为分隔符,因此当文件名中有空格或其他特殊字符时,rm不会失败。

当一个应用程序创建了数百万无用的日志文件,填满了所有inode时,我也遇到过类似的问题。我求助于“定位”,将所有“定位”的文件放入文本文件,然后逐一删除。花了一段时间,但完成了任务!

一个更短更可靠的呢?

for i in **/*.pdf; do rm "$i"; done

一个比使用xargs更安全的版本,也不是递归的:ls-p | grep-v“/$”| grep“\.pdf$”|读取文件时;do rm“$file”;完成

在这里过滤我们的目录有点不必要,因为“rm”无论如何都不会删除它,为了简单起见,可以删除它,但为什么要运行肯定会返回错误的东西呢?

如果它们是带有空格或特殊字符的文件名,请使用:

find -name "*.pdf"  -delete

仅适用于当前目录中的文件:

find -maxdepth 1 -name '*.pdf' -delete

这句话搜索当前目录(-maxdeph 1)中扩展名为pdf(-name'*.pdf')的所有文件,然后删除。