当前位置: 首页>>技术教程>>正文


查找包含大量文件的目录

, ,

问题描述

因此,我的一位客户今天收到了来自Linode的电子邮件,称他们的服务器导致Linode的备份服务爆炸。为什么?文件太多了。我笑了然后跑了:

# df -ih
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/xvda        2.5M  2.4M   91K   97% /

废话。使用240万个inode。到底是怎么回事?!

我已经找到了明显的嫌疑人(/var/{log,cache}和托管所有网站的目录),但我找不到任何真正可疑的东西。在这个野兽的某个地方我肯定有一个包含几百万个文件的目录。

对于上下文一个我忙碌的服务器使用200k inode和我的桌面(旧的安装超过4TB的二手存储)只有一百多万。这儿存在一个问题。

所以我的问题是,我如何找到问题所在?是否有针对inode的du

最佳解决办法

检查/lost+found是否存在磁盘问题,并且很多垃圾最终被检测为单独的文件,可能是错误的。

检查iostat以查看某些应用程序是否仍在生成疯狂的文件。

find / -xdev -type d -size +100k将告诉您是否存在使用超过100kB磁盘空间的目录。那将是一个包含大量文件的目录,或者过去包含很多文件的目录。您可能想要调整大小数字。

我不认为GNU du的选项组合使其每个目录条目计数1。您可以通过使用find生成文件列表并在awk中进行一些计数来完成此操作。这是一个用于inode的du。经过最低限度的测试,不会尝试处理包含换行符的文件名。

#!/bin/sh
find "$@" -xdev -depth | awk '{
    depth = $0; gsub(/[^\/]/, "", depth); depth = length(depth);
    if (depth < previous_depth) {
       # A non-empty directory: its predecessor was one of its files
       total[depth] += total[previous_depth];
       print total[previous_depth] + 1, $0;
       total[previous_depth] = 0;
    }
    ++total[depth];
    previous_depth = depth;
}
END { print total[0], "total"; }'

用法:du-inodes /。以递归方式显示non-empty目录的列表及其中的条目总数及其子目录。将输出重定向到文件并随意查看。 sort -k1nr <root.du-inodes | head会告诉你最大的罪犯。

次佳解决办法

您可以查看此脚本:

#!/bin/bash

if [ $# -ne 1 ];then
  echo "Usage: `basename $0` DIRECTORY"
  exit 1
fi

echo "Wait a moment if you want a good top of the bushy folders..."

find "$@" -type d -print0 2>/dev/null | while IFS= read -r -d '' file; do 
    echo -e `ls -A "$file" 2>/dev/null | wc -l` "files in:\t $file"
done | sort -nr | head | awk '{print NR".", "\t", $0}'

exit 0

这将按文件计数打印前10个子目录。如果需要顶部x,请将head更改为head -n x,其中x是大于0的自然数。

要获得100%肯定的结果,请使用root权限运行此脚本:

filesystem,inode,ubuntu

第三种解决办法

如果您的定位数据库是最新的,通常比查找更快:

# locate '' | sed 's|/[^/]*$|/|g' | sort | uniq -c | sort -n | tee filesperdirectory.txt | tail

这会转储整个locate数据库,剥离路径中最后一个’/’之后的所有内容,然后排序和“uniq -c”获取每个目录的文件/目录数。 “sort -n”通过管道传送到你的十个目录中,其中包含大部分内容。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/2633.html,未经允许,请勿转载。