我已经从这些日志文件夹内运行了以下命令。但看起来每个文件夹都需要无限的时间。
查找 . -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
,文件系统必须执行以下操作:
即使您rm
删除了目录,您也只能省去上面的步骤 #2,因为您仍然需要查询目录并减少链接计数。查询目录可以优化以同时获取多个 inode 编号,但在所有情况下,对于要删除的每个文件,文件系统都必须检查 inode 中的链接计数并更新 inode(或将其标记为删除)。
换句话说,此操作是O(n)
根据要删除的文件数量进行的,在您的情况下,这个数字似乎非常大。
如果你无法格式化你的分区,我猜你的情况就是这样;-),只需在后台启动该任务,或者在屏幕并且要有耐心。
另一个解决方案是备份要保留的文件,格式化分区,然后恢复文件。也许这比删除所有文件更快,但是否更耗时(find...rm
如果需要,可能会在后台忘记很多天……)。