查找包含大量文件的目录

查找包含大量文件的目录

今天我的一个客户收到了一封来自 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)只有一百万多一点。有问题。

所以我的问题是,我如何找到问题所在? 是否有duinode?

答案1

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

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

find / -xdev -type d -size +100k会告诉您是否有目录占用了超过 100kB 的磁盘空间。这可能是一个包含大量文件的目录,或者过去包含大量文件的目录。您可能需要调整大小数字。

我认为 GNU 没有选项组合du可以使其每个目录条目计数为 1。您可以通过使用findawk 生成文件列表并进行少量计数来实现这一点。这是duinode 的。经过最低限度的测试,不会尝试处理包含换行符的文件名。

#!/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 /。以递归方式打印非空目录列表,其中包含其中的条目总数及其子目录。将输出重定向到文件并在空闲时查看。sort -k1nr <root.du-inodes | head会告诉您最大的违规者。

答案2

你可以用这个脚本来检查:

#!/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 个,请将其更改headhead -n x,其中x是大于 0 的自然数。

为了获得 100% 的确定结果,请以 root 权限运行此脚本:

顶部浓密的文件夹

答案3

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

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

这将转储整个定位数据库,删除路径中最后一个“/”之后的所有内容,然后排序和“uniq -c”可让您获得每个目录中的文件/目录的数量。“sort -n”通过管道传输到 tail 可让您获得包含最多内容的十个目录。

答案4

另一个建议:

http://www.iasptk.com/20314-ubuntu-find-large-files-fast-from-command-line

使用这些搜索来查找服务器上最大的文件。

查找超过 1GB 的文件

sudo find / -type f -size +1000000k -exec ls -lh {} \;

查找超过 100MB 的文件

sudo find / -type f -size +100000k -exec ls -lh {} \;

查找超过 10MB 的文件

sudo find / -type f -size +10000k -exec ls -lh {} \;

第一部分是使用“-size”标志的 find 命令,用于查找以千字节为单位的不同大小的文件。

末尾以“-exec”开头的最后一位允许指定我们想要对找到的每个文件执行的命令。这里的“ls -lh”命令包含列出目录内容时看到的所有信息。末尾的 h 特别有用,因为它以人类可读的格式打印出每个文件的大小。

相关内容