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
100000
real 0m3.660s
user 0m0.036s
sys 0m0.552s
在 Linux 上删除包含大量文件的目录的最快方法是什么?
“易于与我的抵押贷款机构整合。用了不到 20 分钟。我喜欢它。” - 应用商店评论。
假设这是在一个普通的文件系统上,比如 EXT4。其他一些可能有不同的方法来获得比下面更快的速度(例如,无论有多少文件,在 BTRFS 中恢复快照以省略新创建的目录都需要几分之一秒,并且删除快照同样快)。
诀窍是删除目录而不是其内容。
例如,而不是正常的 rm 命令:
rm -rf /path/to/directory/*
用
rm -rf /path/to/directory
这会执行单个取消链接,而不是针对其中的每个文件取消链接。虽然它仍然必须将每个 inode 设置为未使用 - 没有绕过。
但是,它有一百万或更多的文件存在一些问题。我认为截止日期大约在一百万左右。您会看到一些错误消息,例如“参数列表太长”。
在这种情况下,两种替代方法是相同或更好的。
find /path/to/directory -delete
或者,如果您有 rsync,请在某处创建一个新的空白目录,然后使用删除选项将空白目录 rsync 到现有目录:
为什么我在红帽5上试了 rsync 特别的慢
mkdir /path/to/some/blankdir
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 中的文件时,都是关于 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 long real 0m11.126s user 0m9.673s sys 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.735s user 2m24.330s sys 9m48.743s
|
从我们使用 time 命令得到的输出可以看出,从单个目录中删除 50 万个文件需要 14 分 51 秒。 这是相当长的时间,因为对每个文件执行一个单独的 rm 命令,直到文件的完整列表被删除。
现在让我们通过在 find 命令中使用-delete选项来测试消耗的时间。
?
12345
| [root@myvm1 test]# time find ./ -type f - delete real 5m11.937s user 0m1.259s sys 0m28.441s [root@myvm1 test]#
|
哇你看到那个结果了!!-delete 选项只用了 5 分 11 秒。当您在 Linux 中删除数百万个文件时,这对速度来说是一个了不起的改进。
现在让我们看看使用 Perl 语言删除文件是如何工作的,以及它与我们之前看到的其他选项相比的速度。
?
1234
| [root@myvm1 test]# time perl -e 'for(<*>){((stat)[9]<(unlink))}' real 1m0.488s user 0m7.023s sys 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 Rashadul于2014年 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 慢。
永久链接 tomator于2017 年 4月 29 日星期六提交 - 02:28
rm 失败,因为 * 被 shell 扩展为巨大的列表。没有人真正这样做,因为文件被打包在文件夹中。所以:
$ time rm -rf $(pwd)
“pwd”使其打印当前目录,跳过所有符号链接。
永久链接 Uwe Brauer于 2017 年 11 月 16 日星期四提交- 17:34
你好
确实
perl -e 'for(<*>){((stat)[9]<(unlink))}'
非常快,但*没有*删除所有子目录。那些以 . 剩下的
,对于其他人,我想不出原因。但是我不懂perl,所以不知道
语法的意思
永久链接 Vinnom于2018年 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