在Linux中删除文件最快的方法是什么
创建,删除和修改文件是用户在任何操作系统中执行的常见任务之一。
这种任务属于用户每天执行的任务列表。
尽管在删除Linux或者任何其他操作系统中的单个或者少数文件时,这是非常快速和无缝的操作。
但是,如果文件数量很大,则删除操作将花费很长时间才能完成。
在Linux中删除文件时会发生什么情况,取决于要删除的文件所在的文件系统的类型。
在不同类型的文件系统下删除文件有许多操作上的区别。
当我们谈论Linux中的文件时,其全部内容都是关于inode而不是文件。
在删除文件期间如何修改索引节点是一个重要的方面。
索引节点是Linux操作系统的构建块。
我正在写这篇文章,以找出删除Linux中大量文件的最快方法。
我们将以一些简单的文件删除方法开始本教程,然后将比较不同方法完成文件删除任务的速度。
写这篇文章的另一个主要原因是我花在我们的一台爬虫服务器上的时间,以删除数百万个很小的文件(几KB)。
正如我所告诉的,如果我们要处理的文件数量很少,那么与大量的文件相比,该操作将非常快,而文件的大小却非常小。
让我们从Linux中用于删除文件的一些简单命令开始。
在Linux中删除文件的命令及其示例用法
要在Linux中删除文件,最常用的命令是rm命令。
让我们看一下rm命令的一些示例。
[root@myvm1 ~]# rm -f testfile
上面命令中使用的-f命令将在不要求确认的情况下强行删除文件。
[root@myvm1 ~]# rm -rf testdirectory
上面的命令将删除名为“ testdirectory”的目录以及该目录中的所有内容(-r选项用于递归删除文件)
[root@myvm1 ~]# rmdir testdirectory
上面的命令rmdir仅在目录为空时才会删除该目录。
现在让我们看一下在Linux中删除文件的一些不同方法。
我最喜欢的方法之一是使用find命令。
查找命令是一种非常方便的工具,可用于根据文件的类型,大小,创建日期,修改日期以及更多不同的条件来搜索文件。
要了解有关Linux中这个出色的搜索工具的更多信息,请阅读以下文章。
[root@myvm1 /]# find /test -type f -exec rm {} \;
上面显示的命令,将删除/test目录中的所有文件。
首先,find命令将查找目录中的所有文件,然后针对每个结果执行并执行rm。
让我们看看可以与find命令一起使用的一些不同的方法来删除文件。
[root@myvm1 /]# find /test -mtime +7 -exec rm {} \;
在上面显示的示例中,find命令将搜索/test目录中所有7天前已修改的文件,然后将其删除。
[root@myvm1 /]# find /test -size +7M -exec rm {} \;
在上面显示的示例中,将在目录/test中搜索所有大于7M的文件,然后删除每个文件。
在上面显示的find命令的所有示例中,将为列表中的每个文件调用rm命令。
例如,在上面显示的最后一个find命令中,如果结果是50个大于7M的文件,则将调用50个rm命令来删除每个文件。
这将花费更长的时间。
除了在find中使用-exec参数的帮助下使用rm的上述命令之外,还有更好的选择。
我们将看到替代方案,然后计算每种方案之间的速度差。
正如我之前所说,找到删除速度的主要思想是删除大量文件。
因此,首先借助简单的bash for loop创建半百万个文件。
在创建了五百万个文件之后,我们将尝试使用rm命令将其删除,使用exec参数查找命令,然后将看到更好的find命令替代方案。
[root@myvm1 test]# for i in $(seq 1 500000); do echo testing >> $i.txt; done
上面的命令将在当前工作目录中创建5十万个文件(一百万个半),名称从1.txt到500000.txt,每个文件都包含文本“ testing”,因此文件大小至少应在几千字节的范围。
现在让我们测试使用不同的命令删除这些数量的文件的速度。
首先让我们使用简单的rm命令,然后将find命令与-exec一起使用,然后使用delete选项计算删除这些文件数量所需的时间。
[root@myvm1 test]# time rm -f * -bash: /bin/rm: Argument list too long real 0m11.126s user 0m9.673s sys 0m1.278s
如果我们看到我在测试目录上运行了上面的rm命令,该命令包含500万个文件,它给了我一条消息,说/bin/rm:参数列表太长。
这意味着命令没有完成删除,因为给rm命令的文件数量太大而无法完成。
因此rm命令甚至没有经受住考验,因为它放弃了。
不要注意time命令显示的时间,因为rm命令没有完成其操作,并且time命令显示输出而不会影响命令的最终结果。
现在,让我们使用以前看到的find命令和-exec参数。
[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选项来测试消耗的时间。
[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语言删除文件的工作方式,以及与我们之前看到的其他选项相比它的速度。
[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通常用于在两个不同位置之间同步文件。
这可以通过简单地将具有大量文件的目标目录与一个空目录同步来实现。
在我们的例子中,测试目录有500万个文件,让我们创建一个名为blanktest的目录,该目录将保留为空以用于简单同步。
现在,与此同时,我们将在rsync中使用-delete选项,这将删除目标目录中所有不存在于源文件中的文件(在本例中,源文件为空目录,因此目录中的所有文件目标目录将被删除。
)
空目录:/home/blanktest
要清空的目录:/test
[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分钟 |
使用-delete查找命令 | 5分钟半百万文件 |
perl | 1分钟半文件 |
rsync与-delete | 2分56秒半文件 |