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

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

rm -f *.pdf

我收到以下错误:

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

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


当前回答

还有一个:

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不会失败。

其他回答

如果您试图一次删除大量文件(我今天删除了一个485000+的目录),您可能会遇到以下错误:

/bin/rm: Argument list too long.

问题是,当您键入类似rm-rf*的内容时,*将被替换为每个匹配文件的列表,如“rm-rf file1 file2 file3 file4”等。分配了一个相对较小的内存缓冲区来存储此参数列表,如果该缓冲区已满,shell将不会执行程序。

为了解决这个问题,很多人会使用find命令查找每个文件,并将它们逐一传递给“rm”命令,如下所示:

find . -type f -exec rm -v {} \;

我的问题是我需要删除50万个文件,而且时间太长了。

我偶然发现了一种更快的删除文件的方法——“find”命令内置了“-delete”标志!以下是我最终使用的:

find . -type f -delete

使用这种方法,我以每秒2000个文件的速度删除文件,速度快得多!

您还可以在删除文件名时显示文件名:

find . -type f -print -delete

…甚至显示将删除多少文件,以及删除这些文件所需的时间:

root@devel# ls -1 | wc -l && time find . -type f -delete
100000
real    0m3.660s
user    0m0.036s
sys     0m0.552s

我在将源目录复制到目标目录时遇到了同样的问题

源目录包含文件约3 lakcs

我使用cp和选项-r,这对我很有用

cp-r abc/def/

它会将所有文件从abc复制到def,而不会发出参数列表过长的警告

或者您可以尝试:

find . -name '*.pdf' -exec rm -f {} \;

对于没有时间的人。在终端上运行以下命令。

ulimit -S -s unlimited

然后执行cp/mv/rm操作。

一个更短更可靠的呢?

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