Linux技巧:一次删除一百万个文件的最快方法

最初的测评

昨天,我看到一个非常有趣的删除一个目录下的海量文件的方法。这个方法来自http://www.quora.com/How-can-someone-rapidly-delete-400-000-files里的Zhenyu
Lee。

他没有使用find 或 xargs,他很有创意的利用了rsync的强大功能,使用rsync
–delete
将目标文件夹以一个空文件夹来替换。之后,我做了一个实验来比较各种方法。让我吃惊的是,Lee的方法要比其它的快的多。下面就是我的测评。

环境:

  • CPU: Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz
  • MEM: 4G
  • HD: ST3250318AS: 250G/7200RPM
Method # Of Files Deletion Time
rsync -a –delete empty/ s1/ 1000000 6m50.638s
find s2/ -type f -delete 1000000 87m38.826s
find s3/ -type f | xargs -L 100 rm 1000000 83m36.851s
find s4/ -type f | xargs -L 100 -P 100 rm 1000000 78m4.658s
rm -rf s5 1000000 80m33.434s

使用 –delete 和 –exclude,你可以选择性删除符合条件的文件。还有一点,当你需要保留这个目录做其它用处时,这种方法是再适合不过了。

重新测评

几天前,Keith-Winstein在回复Quora上的这个帖子时说我之前的测评无法复制,因为操作的时间持续的太久。我澄清一下,这些数据过大,可能是因为我的计算机在过去的几年里做的事太多,测评中可能存在一些文件系统错误。但我不确定是这些原因。现在好了,我弄了一天比较新的计算机,把测评再做一次。这次我使用/usr/bin/time,它能提供更详细的信息。下面就是新的结果。

(每次都是1000000个文件。每个文件的体积都是0。)

Command Elapsed System Time %CPU cs (Vol/Invol)
rsync -a –delete empty/ a 10.60 1.31 95 106/22
find b/ -type f -delete 28.51 14.46 52 14849/11
find c/ -type f | xargs -L 100 rm 41.69 20.60 54 37048/15074
find d/ -type f | xargs -L 100 -P 100 rm 34.32 27.82 89 929897/21720
rm -rf f 31.29 14.80 47 15134/11

原始输出

# method 1
~/test $ /usr/bin/time -v  rsync -a --delete empty/ a/
        Command being timed: "rsync -a --delete empty/ a/"
        User time (seconds): 1.31
        System time (seconds): 10.60
        Percent of CPU this job got: 95%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:12.42
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 0
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 24378
        Voluntary context switches: 106
        Involuntary context switches: 22
        Swaps: 0
        File system inputs: 0
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0

# method 2
        Command being timed: "find b/ -type f -delete"
        User time (seconds): 0.41
        System time (seconds): 14.46
        Percent of CPU this job got: 52%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:28.51
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 0
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 11749
        Voluntary context switches: 14849
        Involuntary context switches: 11
        Swaps: 0
        File system inputs: 0
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0
# method 3
find c/ -type f | xargs -L 100 rm
~/test $ /usr/bin/time -v ./delete.sh
        Command being timed: "./delete.sh"
        User time (seconds): 2.06
        System time (seconds): 20.60
        Percent of CPU this job got: 54%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:41.69
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 0
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 1764225
        Voluntary context switches: 37048
        Involuntary context switches: 15074
        Swaps: 0
        File system inputs: 0
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0

# method 4
find d/ -type f | xargs -L 100 -P 100 rm
~/test $ /usr/bin/time -v ./delete.sh
        Command being timed: "./delete.sh"
        User time (seconds): 2.86
        System time (seconds): 27.82
        Percent of CPU this job got: 89%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:34.32
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 0
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 1764278
        Voluntary context switches: 929897
        Involuntary context switches: 21720
        Swaps: 0
        File system inputs: 0
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0

# method 5
~/test $ /usr/bin/time -v rm -rf f
        Command being timed: "rm -rf f"
        User time (seconds): 0.20
        System time (seconds): 14.80
        Percent of CPU this job got: 47%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:31.29
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 0
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 176
        Voluntary context switches: 15134
        Involuntary context switches: 11
        Swaps: 0
        File system inputs: 0
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0

我真的十分好奇为什么Lee的方法要比其它的快,竟然比rm -rf也要快。如果有人知道,请写在下面,非常感谢。

[英文原文:A
faster way to delete millions of files in a directory
 ]

This entry was posted in 技术技巧 and
tagged linux. Bookmark the permalink.

时间: 2024-09-12 08:59:14

Linux技巧:一次删除一百万个文件的最快方法的相关文章

Linux 技巧:让进程在后台可靠运行的几种方法

原文地址: http://www.ibm.com/developerworks/cn/linux/l-cn-nohup/ 申 毅, 软件工程师, IBM 中国软件开发中心 简介: 想让进程在断开连接后依然保持运行?如果该进程已经开始运行了该如何补救? 如果有大量这类需求如何简化操作? 我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败.如何让命令提交后不受本地关闭终端窗口/网络断开连接的干扰呢?

C#技巧之快速删除bin和obj文件夹的方法

C#程序总会生成bin和obj文件夹,为了减小源码的大小,就有必要将这两个文件夹删除,于是想到用批处理文件来删除   以下是批处理的代码: @echo off set nowPath=%cd% cd cd %nowPath% ::delete specify file(*.pdb,*.vshost.*) for /r %nowPath% %%i in (*.pdb,*.vshost.*) do (del %%i) ::delete specify folder(obj,bin) for /r %

Linux服务器FTP无法删除网站html静态文件

  原因:这是FTP和网站运行账户不统一的问题. 解决办法:远程登陆主机,然后按下面命令操作: 以cd /home/网站目录不能删除为例子 chmod 777 文件或目录 -Rf 实例:cd /home/web chmod 777 html -Rf cd html chmod 777 * -Rf

在Linux系统中批量删除多个文件的方法总结

  当我们在linux系统中要删除数万或者数十万甚至数百万的文件时使用rm -rf *就不太好用,因为要等待很长一段时间.在这种情况之下我们可以使用linux系统命令rsync来巧妙的处理.rsync实际上用的是替换原理,处理数十万个文件也是秒删. 1. rsync安装,有些系统默认安装有该命令 ubuntu系统: 代码如下: sudo apt-get install rsync fedora 系统: 代码如下: sudo yum install rsync 其他的可以源码安装,到下面的网站下载

Linux如何使用inode删除文件

  文件的inode定义了文件的大小.所有人等文件的特征.每个文件和目录都有自己唯一的inode数字.但是为什么用inode来删除文件,而不是用常用的rm -rf命令呢?原因是,如果你不小心创建了含有特殊字符的文件和目录,比如带有 ? * ^ 的文件名,就会很难删除.下面我们就来介绍一下:1)如何找出文件和目录的inode;2)配合find命令,删除特定的inode文件;3)其他有用的删除顽固文件的方法. * 如何找出文件的inode? 用stat 或者ls -il .带有 -i 参数的ls命令

linux如何恢复被删除的热文件

windows下如果文件被删除还有回收站,如果没放入回收站或者回收站被清空了,还可以使用easyrecover或者finaldata等等很多工具来恢复: 可是linux下没有回收站,那么linux下如果文件被删除了如何恢复呢?如果刚好你删除的文件还在被其它程序调用,那么恭喜你,很轻易的的将删除的文件找回来 我们先手工来删除我们的日志文件/mnt/ramdisk/messages,删除前我们显卡一下这个文件的内容 01 [root@test ~]# head /ramdisk/message 02

linux中使用root权限都删除不了的文件该怎办?

  在linux系统中,root用户拥有最高权限,可以干任何事情,但是有些时候,root用户却不能删除一个小小的一般文件.其实只要root用户更改下这个文件的属性,还是可以删除的. 1.首先删除一个文件,提示'Operation not permitter',普通用户不能删除; 2.把用户升级到root用户,然后在删除,然后提示'Operation not permitter',居然root用户都无法删除,这个不太科学啊; 3.原来是文件的属性在里面作怪,只要登录超级用户,查看下文件的属性都有哪

linux双系统直接删除linux修复

  window linux双系统直接删除linux修复 用win7和fedora双系统如果直接将fedora所在的分区格式化,由于grub写好的mbr不能找到相应的配置文件.所以不能启动win7. 这时需要修复mbr,具体办法如下: 插入win7系统安装盘,设置为光驱引导 选择完语言选项后,进入下一步,选择左下角的[系统修复]而不是继续安装. 自动搜索完已经安装的系统后,进入下一步. 这里不要点windows自动修复,而是进入[命令提示符模式] 先输入命令 bootrec/fixmbr 回车,

linux技巧之使用screen管理你的远程会话

linux技巧-使用screen管理你的远程会话 当我们用ssh或是telent远程登录到linux服务器上,运行一些长时间的任务,必须等待任务完成才能离开该界面.在此期间不能关闭窗口或者断开连接.否则这个任务的进程就会别杀掉,一切半途而废,需要重新执行该任务. 如何解决这个问题? 首先来理解几个概念: 进程组:一个或多个进程的集合,每个进程组有唯一一个进程组ID,即进程组长进程的ID 会话期:一个或多个进程组的集合,有唯一一个会话期首进程,会话期ID为首进程的ID 会话期可以有一个单独的控制终