删除目录中的数百万个文件

删除目录中的数百万个文件

前几天,我在系统上运行了 bleachbit。我启用了其中的清除磁盘空间选项。它花了几个小时,我的磁盘空间已经完全填满(100GB 左右)。在等待了很久之后,我决定终止该程序并手动删除文件。

现在的问题是:我无法删除文件或目录。我无法在目录中执行 ls。我尝试了 rsync -a --delete、wipe、rm、find 和 rm 的不同组合等

我按照这里的说明进行操作,并注意到我的日志中也出现了“目录索引已满!”的错误。rm 包含数百万个文件的目录

我注意到 stat 命令返回的目录大小异常大,超过 1 GB。通常只有 4096 或几万左右。

nameh@labs ~ % stat kGcdTIJ1H1                                                                            
  File: ‘kGcdTIJ1H1’
  Size: 1065287680  Blocks: 2080744    IO Block: 4096   directory
Device: 24h/36d Inode: 9969665     Links: 2
Access: (0777/drwxrwxrwx)  Uid: ( 1000/  nameh)   Gid: ( 1000/  nameh)
Access: 2014-10-31 07:43:08.848104623 +0530
Modify: 2014-10-31 07:43:19.727719839 +0530
Change: 2014-10-31 07:43:19.727719839 +0530
 Birth: -

到目前为止,似乎能够删除此目录中文件的“唯一”命令是 srm 命令(THC 的安全删除工具包)。所有其他命令均不起作用。srm 已运行 20 小时,迄今已释放了约 1.1 GB。它以最不安全的模式运行。

sudo srm -v -rfll kGcdTIJ1H1

有想法吗?

编辑:我的问题是“如何快速删除目录?”。比如在几个小时左右,而不必花几天的时间来删除文件。rm -rf 不执行任何操作。

答案1

我曾经遇到过类似的问题,其中一个分区中存有数百万个文件,因此消耗了所有可用的 inode,尽管文件系统有近 20GB 的可用空间,但我无法在其上创建任何文件,因为 inode 已耗尽。

所以我运行了 find 命令,删除了 140 万个文件,但这花了相当长一段时间,因为使用 find 和 exec 组合 find 会将每个文件传递给 exec 函数,然后对文件运行 rm 命令

cd /to/directory 查找 . -type f -exec rm {} \;

或者

你可能想尝试 xargs

查找 . -type f |xargs rm

这两个命令对我都有效

希望能帮助到你。

答案2

你可以使用这个 perl 技巧:

perl -e 'chdir "/path/to/dir" or die; opendir D, "."; while ($n = readdir D) { unlink $n }'

其作用是,首先进入目录,打开它,然后删除(取消链接)其中的所有文件,而不先获取所有文件的列表(这可能是 rm 阻塞的地方)。

这个诀窍不是我的,而是 Randal L. Schwartz 的:http://blogs.perl.org/users/randal_l_schwartz/2011/03/perl-to-the-rescue-case-study-of-deleting-a-large-directory.html

答案3

您可以尝试以下操作

查找。-type d -print -delete #drop -print 不看你删除了什么,我发现这是最糟糕的

找到 . -type f -exec rm {} \;#比上面慢

查找 . -mtime +29 -print | xargs ls -d

相关内容