欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

在Linux中删除大量文件的最快方法 最快速删除 有大用

在 Linux 中删除大量文件(参数列表太长)    

   


Linux 快速提示:    

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

/bin/rm: Argument list too long.
   

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

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

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

我的问题是我需要删除 500,000 个文件,而且花费的时间太长    

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

find . -type f -delete

好像 rm -Rf directory/ 速度比 find directory -type f -delete 速度更快点


好像 ls -1 -f | xargs rm -f 速度也可以,可能没有 find directory -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

来自 https://www.stevekamerman.com/2008/03/deleting-tons-of-files-in-linux-argument-list-too-long/        


       


       

如何删除许多(200 000)个文件?            

问问题            
 
活跃 5 年零 6 个月前            
浏览了 7k 次            
17                            
                       

我必须从文件夹中删除 200 000 个文件(所有这些文件),而且我不想删除文件夹本身。                            

使用 rm,我收到“参数列表太长”错误。我试图用 xargs 做一些事情,但我不是一个 Shell Guy,所以它不起作用:                            

find -name * | xargs rm -f
                       
                                           
改进这个问题                                            
  • 5                                        
    为什么不删除文件夹并在删除后重新创建它? —— 加康 2011 年 9 月 27 日 2:28                                        
  • @garconcn 9 年后才读到这篇文章。我不记得我一开始为什么会遇到这个问题,但我想要么我没有提供完整的上下文来使问题可读,要么......这是一个好主意。 —— FMaz008 1 月 1 日 15:16                                        
               

5 个回答    正确答案                            

积极的最老的投票                            
               
36                                
                           
$ find /path/to/folder -type f -delete
                           
                                               
改进这个答案                                                
  • 15                                            
    可能值得一提的是,GNU find(大多数 Linux 发行版使用的)可以使用-delete这也避免了包含引号或换行符的文件的问题(尽管您可以使用 GNU find-print0和 GNU xarg 的-0选项来解决这个问题)。 —— 德福克 2011 年 9 月 26 日 16:22                                            
  • 3                                            
    @DerfK,好话!此外,大量的脂肪酶往往与游戏xargs同时find具有-exec command {} +语法。 —— 波伊 2011-09-26 17:16                                             
               
5                                
                           

你做的一切都是正确的。'*'给您带来问题(shell 将其扩展为文件列表而不是find)。正确的语法可能是:                                

cd <your_directory>; find . -type f | xargs rm -f
find <your_directory> -type f | xargs rm -f
                               

(后者效率稍低,因为它会将更长的名称传递给xargs,但您几乎不会注意到:-))                                

或者,您可以像这样转义您的'*'(但是在这种情况下,它也会尝试删除“.”和“..”;这不是什么大问题-您只会收到一点警告:-)):                                

find . -name '*' | xargs rm -f
find . -name "*" | xargs rm -f
find . -name \* | xargs rm -f
                               

如果您的文件名包含空格,请使用以下命令:                                

find . -type f -print0 | xargs -0 rm -f
                           
                                               
改进这个答案                                                
  • 1                                            
    如果您的文件名包含空格,这将不起作用。 —— 用户9517 2011-09-26 16:25                                            
  • @lain:是的,我只是在编辑我的答案以包含空格的技巧:-) – 杜贝利斯 2011-09-26 16:29                                             
               
3                                
                           

以下命令将从当前目录中删除所有文件                                

find . -type f -exec rm {} \;
                           
                                               
改进这个答案                                                
  • 2                                            
    -name '*'并不意味着“所有文件”。文件是这样说的:-type f – 波伊 2011 年 9 月 26 日 17:09                                            
               
2                                
                           

你可以试试                                

find /path/to/folder -type f -print0  | xargs -0 rm -f
                               

或者                                

find /path/to/folder -type f -exec rm -f "{}" +
                           
                                               
改进这个答案                                                
               
1                                
                           

感谢 quantas 的回答,这里有一些补充。                                

如果您想删除具有特定名称模式的文件,您可以这样编写。还添加了 -print 以便您可以查看删除文件时发生的情况。                                

sudo find /home/mydirectory -name "*.jpg" -type f -print -delete
                               

例如,这会删除 mydirectory 中的所有 jpeg。                                

                                               
改进这个答案                                                
               

你的答案                    

来自  https://serverfault.com/questions/315590/how-to-remove-many-200-000-files                    


       







“易于与我的抵押贷款机构整合。用了不到 20 分钟。我喜欢它。” - 应用商店评论。                                        
               
5 个回答                        

假设这是在一个普通的文件系统上,比如 EXT4。其他一些可能有不同的方法来获得比下面更快的速度(例如,无论有多少文件,在 BTRFS 中恢复快照以省略新创建的目录都需要几分之一秒,并且删除快照同样快)。                                        

诀窍是删除目录而不是其内容。                                        

例如,而不是正常的 rm 命令:                                        

  1. rm -rf /path/to/directory/* 

                                       
                                   

                                   

  1. rm -rf /path/to/directory 

                                   

这会执行单个取消链接,而不是针对其中的每个文件取消链接。虽然它仍然必须将每个 inode 设置为未使用 - 没有绕过。                                

但是,它有一百万或更多的文件存在一些问题。我认为截止日期大约在一百万左右。您会看到一些错误消息,例如“参数列表太长”。                                

在这种情况下,两种替代方法是相同或更好的。                                

  1. find /path/to/directory -delete 

                               

或者,如果您有 rsync,请在某处创建一个新的空白目录,然后使用删除选项将空白目录 rsync 到现有目录:   

为什么我在红帽5上试了 rsync 特别的慢                         

  1. mkdir /path/to/some/blankdir 

  2. rsync -a --delete /path/to/some/blankdir/ /path/to/directory/

                           


最后一个往往是同类产品中最快的,这取决于您的处理器,因为它使用 CPU 能力来快速完成这些事情。Rsync 使用编程方法来操作文件,它似乎是最优化的,因为它根据确切的文件系统(其他人使用内核文件管理调用可能比直接文件系统 API 调用效率低)而改变它所做的事情。                        

当然,您也可以编写脚本。我见过一些可以做得更好的 perl 脚本。但是你需要知道 perl 才能使用它。您甚至应该能够使用 python 并调用 os unlink 函数,对于大多数人来说,这可能比尝试解密 perl 脚本更容易理解。                        

此外,我发现基于文本 UI 的文件管理器 Midnight Commander 往往比通过 GUI 文件管理器更快地删除大量文件。与上面的一些东西一样快。我认为许多 GUI 文件管理器只是调用一个普通的 rm 命令——这就是为什么它们在大目录上往往感觉很慢。                        

来自 https://www.quora.com/What-is-the-fastest-way-to-delete-a-directory-with-a-lot-of-files-on-Linux




Linux中删除文件最快的方法是什么

23分享Sarath Pillai于 Sun, 06/02/2013 - 14:20提交在 linux 中删除文件的更快方法

创建、删除和修改文件是用户在任何操作系统中执行的常见任务之一。这种任务属于用户执行的日常任务列表。尽管在 Linux 或任何其他操作系统中删除单个或少数文件时,它的操作非常快速且无缝。但是如果文件数量很大,那么删除操作需要很长时间才能完成。

在 Linux 中删除文件时会发生什么,取决于要删除的文件所在的文件系统类型。 在不同类型的文件系统下删除文件有很多操作上的差异。当我们谈论 Linux 中的文件时,都是关于 inode 而不是文件。在文件删除期间如何修改 inode 是需要了解的一个重要方面。

inode 是 Linux 操作系统的构建块。如果您对理解 inode 感兴趣,我建议您在继续之前阅读以下帖子,因为我们不会在本文中讨论与 inode 相关的细节。

阅读: Linux 中的 inode 是什么

我写这篇文章是为了找出在 Linux 中删除大量文件的最快方法。我们将从一些简单的文件删除方法开始本教程,然后将比较不同方法完成文件删除任务的速度。写这篇文章的另一个主要原因是我在我们的一个爬虫服务器上花费的时间,以删除数百万个非常小的文件(几 KB)。

正如我所说,如果您正在处理少量文件,那么与大量非常小的文件相比,该操作会很快。让我们从 Linux 中用于删除文件的一些简单命令开始。

 

Linux中删除文件的命令及其示例用法

在 Linux 中删除文件,最常用的命令是 rm 命令。让我们看一些 rm 命令的例子。

?

1            [root@myvm1 ~]# rm -f testfile            

-f在上面的命令中使用,将在不要求确认的情况下强行删除文件。

?

1            [root@myvm1 ~]# rm -rf testdirectory            

上面的命令将删除名为“ testdirectory ”的目录  以及该目录中的所有内容(使用的-r选项是递归删除文件)

?

1            [root@myvm1 ~]# rmdir testdirectory            

上面的命令 rmdir,只有在目录为空时才会删除该目录。

 

现在让我们看看在 Linux 中删除文件的一些不同方法。我最喜欢的方法之一是使用 find 命令。查找命令是一个非常方便的工具,可用于根据文件的类型、大小、创建日期、修改日期和更多不同的条件来搜索文件。要了解有关 Linux 中这个出色的搜索工具的更多信息,请阅读以下帖子。

阅读: Linux 中 find 命令的使用示例

?

1            [root@myvm1 /]# find /test -type f -exec rm {} \;            

上面显示的命令将删除 /test 目录中的所有文件。首先 find 命令会查找目录中的所有文件,然后对于每个结果,它会执行和 rm。

让我们看看可以与 find 命令一起使用的一些不同方法来删除文件。

?

1            [root@myvm1 /]# find /test -mtime +7 -exec rm {} \;            

在上面显示的示例中,find 命令将搜索 /test 目录中 7 天前修改过的所有文件,然后删除每个文件。

?

1            [root@myvm1 /]# find /test -size +7M -exec rm {} \;            

上图示例,将搜索目录/test 中所有大于7M 的文件,然后删除每个文件。

在上面显示的所有 find 命令示例中,为列表中的每个文件调用 rm 命令。例如,在上面显示的最后一个 find 命令中,如果结果是 50 个大于 7M 的文件,则调用 50 个 rm 命令删除每个文件。这将需要更长的时间。

除了在 find 中使用 -exec 参数的帮助下使用上述 rm 命令外,还有一个更好的选择。我们将看到替代方案,然后计算每个方案的速度差异。


正如我之前所说,找到删除速度背后的主要思想是当您删除大量文件时。因此,让我们首先借助一个简单的 bash for 循环创建 50 万个文件。在创建了 50 万个文件后,我们将尝试使用 rm 命令删除它,使用 exec 参数 find 命令然后将看到更好的 find 命令替代

?

1            [root@myvm1 test]# for i in $(seq 1 500000); do echo testing >> $i.txt; done            

上述命令将 在当前工作目录中 创建 50 万个文件(半百万个),名称从 1.txt 到 500000.txt,每个文件都包含文本“testing”,因此文件大小至少在几千字节的范围。现在让我们测试使用不同命令删除这些数量的文件的速度。首先让我们使用简单的 rm 命令,然后将使用带有 -exec 和 delete 选项的 find 命令来计算删除这些文件所需的时间。

?

12345            [root@myvm1 test]# time rm -f *-bash: /bin/rm: Argument list too longreal    0m11.126suser    0m9.673ssys     0m1.278s            

如果您看到我在测试目录上运行的上述 rm 命令,其中包含 50 万个文件,它会给我一条消息说/bin/rm: Argument list too long这意味着该命令没有完成删除,因为给 rm 命令的文件数量太大而无法完成。  所以 rm 命令甚至经不起考验,因为它放弃了。 不要注意 time 命令显示的时间,因为 rm 命令没有完成它的操作,time 命令显示输出而不关心命令的最终结果。

现在让我们使用我们之前看到的带有 -exec 参数的 find 命令。

?

1234            [root@myvm1 test]# time find ./ -type f -exec rm {} \;real    14m51.735suser    2m24.330ssys     9m48.743s            

从我们使用 time 命令得到的输出可以看出,从单个目录中删除 50 万个文件需要 14 分 51 秒。 这是相当长的时间,因为对每个文件执行一个单独的 rm 命令,直到文件的完整列表被删除。

现在让我们通过在 find 命令中使用-delete选项来测试消耗的时间

?

12345            [root@myvm1 test]# time find ./ -type f -deletereal    5m11.937suser    0m1.259ssys     0m28.441s[root@myvm1 test]#            

哇你看到那个结果了!!-delete 选项只用了 5 分 11 秒。当您在 Linux 中删除数百万个文件时,这对速度来说是一个了不起的改进。

现在让我们看看使用 Perl 语言删除文件是如何工作的,以及它与我们之前看到的其他选项相比的速度。

?

1234            [root@myvm1 test]# time perl -e 'for(<*>){((stat)[9]<(unlink))}'real    1m0.488suser    0m7.023ssys     0m27.403s            

与我们之前看到的其他 find 命令和 rm 命令选项相比,这非常快。到目前为止,这似乎是可以用来删除目录中所有文件的最佳方法。在 Linux 中删除文件的速度是一项了不起的成就。如果您看到输出,Perl 只花了大约 1 分钟就删除了该目录中的 50 万个文件。

但是,是的,如果您有兴趣在使用 Perl 时找到更复杂的选项,则需要对 Perl 正则表达式有一定的了解。

还有一种较少使用且鲜为人知的方法可用于删除文件夹内的大量文件。这种方法正是我们著名的工具RSYNC,用于在 Linux 中的两个本地和远程位置之间传输和同步文件。

让我们来看看在 RSYNC 命令的帮助下删除文件夹内所有文件的方法。 在 rsync 的帮助下删除文件背后使用的方法和逻辑基于 rsync 通常用于在两个不同位置之间同步文件的事实。

这可以通过简单地将具有大量文件的目标目录与空目录同步来实现。在我们的例子中test目录有 50 万个文件,让我们创建一个名为blanktest的目录为了简单的同步,它将保持为空。现在,我们将在 rsync 中使用 -delete 选项,这将删除目标目录中的所有文件,这些文件在源文件中不存在(在我们的示例中,源文件是一个空目录,因此目录中的所有文件目标目录将被删除。)

空目录:/home/blanktest

要清空的目录: /test

为什么我在红帽5上试了 rsync 特别的慢

?

1234            

[root@myvm1 home]# time rsync -a --delete blanktest/ test                

/real    2m52.502s                

user    0m2.772s                

sys     0m32.649s                

结果非常令人印象深刻,因此与 find 命令相比,如果您想清空包含数百万个文件的目录,使用 rsync 会更好。

下表总结了 Linux 中文件删除的速度,在 Linux 中使用了不同的方法。

命令            所用的时间            
RM 命令            无法删除大量文件            
使用 -exec 查找命令            14 分钟处理 50 万个文件            
使用 -delete 查找命令            5 分钟处理 50 万个文件            
珀尔            1 分钟处理 50 万个文件            
RSYNC 与 -delete            2 分 56 秒处理 50 万个文件            

 


注释

快速删除数十亿文件

永久链接 Md Rashadul2014年 4 月 15 日星期二提交了... - 19:57

前面的命令很好。
rm -rf directory/ 也可以更快地处理一个文件夹中的十亿个文件。我试过了。

删除锁定文件然后创建相同文件的速度有多快?

永久链接 Sheila于 2015 年 2 月 13 日星期五提交- 19:15

我们有一个连接到数据库的 Ab Initio 应用程序。在它连接之前,它会创建一个锁定文件,命名约定是 pset.xxxx.log.lock。
当它断开连接时,它会删除此锁定文件。当它再次连接时,它会创建相同的锁定文件。

但是,由于此应用程序进行如此频繁的连接,例如几秒钟内有多个连接,它会在创建或删除锁定文件时挂起。

我怀疑它甚至没有给 linux 操作系统足够的时间来删除锁和文件并创建另一个。

我想知道创建和删除锁定文件然后再次创建的速度有多快?
它是 red hat linux 2.6.32-358.55.1.el6.x86_64 #1 SMP x86_64 x86_64 x86_64 GNU/Linux

不错的文章。它启发了我

固定链接 Jun于 2016 年 1月 7日星期四提交- 03:53

不错的文章。它启发我检查 find -delete、rsync 和 perl 的结果。我得到了另一个顶部。在我的 PC 上找到领导者。Linux 4.2、Ubuntu 14.04、Intel i5 4 核、Intel SSD 5xx 系列、EncFS 加密。

$ time for i in $(seq 1 500000); 做回声测试>> $i.txt; 完毕

真实 1m13.263s
用户 0m7.756s
系统 0m57.268s

每次测试都重复操作,结果相似。

$ time rsync --delete -av ../empty/ ./

真正的 4m5.197s
用户 0m4.308s
系统 1m43.400s

$ time find ./ -delete

真实 2m19.819s
用户 0m1.044s
系统 0m59.100s

$ time perl -e 'unlink for ( <*> ) '
real 3m17.482s
user 0m2.524s
sys 1m29.196s

我的 perl 代码比你的效率高一点。因为你做了不需要的统计电话。无论如何,perl 比 find 慢。

R M

永久链接 tomator2017 年 4月 29 日星期六提交 - 02:28

rm 失败,因为 * 被 shell 扩展为巨大的列表。没有人真正这样做,因为文件被打包在文件夹中。所以:

$ time rm -rf $(pwd)

“pwd”使其打印当前目录,跳过所有符号链接。

Perl解决方案

永久链接 Uwe Brauer于 2017 年 11 月 16 日星期四提交- 17:34

你好

确实
perl -e 'for(<*>){((stat)[9]<(unlink))}'
非常快,但*没有*删除所有子目录。那些以 . 剩下的
,对于其他人,我想不出原因。但是我不懂perl,所以不知道
语法的意思

正如番茄所说,只需要

永久链接 Vinnom2018年 5 月 2 日星期三提交- 07:35

正如番茄所说,只需要正确使用

$ time rm -rf teste/

真实 0m9,815s
用户 0m3,210s
系统 0m5,986s

$ time perl -e 'unlink for ( <*> ) '

真实 0m20,237s
用户 0m5,847s
系统 0m10,195s

我使用相同的 bash 表达式来创建文件(for i in $(seq 1 500000); do echo testing >> $i.txt; done)

rm 是开胃菜

添加新评论

来自  https://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux



普通分类: