我在UNIX的一个目录下有几百个PDF。PDF的名称非常长(约60个字符)。
当我尝试使用以下命令一起删除所有PDF时:
rm -f *.pdf
我收到以下错误:
/bin/rm: cannot execute [Argument list too long]
此错误的解决方案是什么?mv和cp命令是否也会出现此错误?如果是,如何解决这些命令?
我在UNIX的一个目录下有几百个PDF。PDF的名称非常长(约60个字符)。
当我尝试使用以下命令一起删除所有PDF时:
rm -f *.pdf
我收到以下错误:
/bin/rm: cannot execute [Argument list too long]
此错误的解决方案是什么?mv和cp命令是否也会出现此错误?如果是,如何解决这些命令?
当前回答
使用GNU并行(sudo apt install parallel)非常简单
它以多线程方式运行命令,其中“{}”是传递的参数
E.g.
ls/tmp/myfiles*|并行“rm{}”
其他回答
查找具有-delete操作:
find . -maxdepth 1 -name '*.pdf' -delete
当一个应用程序创建了数百万无用的日志文件,填满了所有inode时,我也遇到过类似的问题。我求助于“定位”,将所有“定位”的文件放入文本文件,然后逐一删除。花了一段时间,但完成了任务!
如果您试图一次删除大量文件(我今天删除了一个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
我很惊讶这里没有ulimit答案。每次我遇到这个问题,我都会在这里或这里结束。我知道这个解决方案有局限性,但ulimit-s 65536似乎经常为我提供帮助。
如果它们是带有空格或特殊字符的文件名,请使用:
find -name "*.pdf" -delete
仅适用于当前目录中的文件:
find -maxdepth 1 -name '*.pdf' -delete
这句话搜索当前目录(-maxdeph 1)中扩展名为pdf(-name'*.pdf')的所有文件,然后删除。