无法在 Linux 中一次删除大量文件

无法在 Linux 中一次删除大量文件

我已经从这些日志文件夹内运行了以下命令。但看起来每个文件夹都需要无限的时间。

查找 . -type f -exec rm -v {} \;

rwxrwxr-x  2 root     root      77881344 Mar 16 03:06 logs.123  
drwxrwxr-x  2 root     root     105709568 Nov 14 20:09 logs_15Nov2011  
drwxrwxr-x  2 root     root       6852608 Aug  1  2011 logs2  
drwxrwxr-x  2 root     root     286191616 Nov  2 08:40 logs_2Nov  
drwxrwxr-x  2 root     root      25206784 Nov 10 04:04 logs_del  
drwxrwxr-x  4 root     root       2686976 Oct  6 01:56 logs_delete  
drwxrwxr-x  2 root     root          4096 May 11  2011 logsMay112011  
drwxrwxr-x  2 root     root      69087232 Aug 29  2011 logs_old  
drwxrwxr-x  7 root     root     382480384 May  9  2011 logs.old905  
drwxrwxr-x  2 root     root          4096 May 11  2011 logsTR1218

有没有比这更好更快的建议来删除所有这些日志?

答案1

GNU find 具有 -delete 选项,它始终是安全的:

find . -type -f -delete

正如其他地方所评论的,您也可以使用 xargs,但要非常小心地使用它。

find . -type f -print0 | xargs -0 rm -vf

答案2

所有其他答案都假设您想保留目录,但从您的原始消息中不清楚您是否这样做;此外,即使您想保留结构,您仍然需要删除并重新创建目录,因为目录文件已成为非常大——当你清空它们时它们不会缩小,并且它们的大小将在将来大大减慢其中的操作速度。

那么你有没有考虑过

rm -rf log*

答案3

如果你能处理 rm 无法删除目录时出现的许多错误,那么你可以从另一个角度来解决这个问题

for dir in $(find . -type d)
do
  rm $dir/*
done

答案4

除了重新格式化分区外,我找不到任何更快的方法来删除所有文件。

问题是这些目录中有大量文件(ls -l您提供的输出大小非常大!)。对于每个文件rm,文件系统必须执行以下操作:

  1. 查询目录索引节点数字,
  2. 更新目录以从中删除文件,
  3. 减少 inode 的链接数(参见硬链接如果你想了解更多关于链接数的信息),
  4. 如果链接数为零,则从磁盘中删除数据。

即使您rm删除了目录,您也只能省去上面的步骤 #2,因为您仍然需要查询目录并减少链接计数。查询目录可以优化以同时获取多个 inode 编号,但在所有情况下,对于要删除的每个文件,文件系统都必须检查 inode 中的链接计数并更新 inode(或将其标记为删除)。

换句话说,此操作是O(n)根据要删除的文件数量进行的,在您的情况下,这个数字似乎非常大。

如果你无法格式化你的分区,我猜你的情况就是这样;-),只需在后台启动该任务,或者在屏幕并且要有耐心。

另一个解决方案是备份要保留的文件,格式化分区,然后恢复文件。也许这比删除所有文件更快,但是否更耗时(find...rm如果需要,可能会在后台忘记很多天……)。

相关内容