如何搜索包含数千个文件的大目录?

如何搜索包含数千个文件的大目录?

文件夹下

/grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache

我们有 100 多个递归文件夹。

其中一个文件夹包含数千个文件。可以识别这个文件夹吗?

我这么问是因为这个文件夹包含数千个文件,而我们可能会遇到一个问题,因为有数千个文件,我们无法删除其中的文件。

答案1

目录中的项目数可以使用以下方式进行计数

set -- *

这会将位置参数( 、 等)设置$1$2当前目录中的名称。扩展后的名称数量*可在 中找到$#。如果您使用bashshell 并设置dotglobshell 选项,则会额外计算隐藏名称。

使用它来查找/grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache包含超过 1000 个名称的目录:

find /grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache \
    -type d -exec bash -O dotglob -c '
        for pathname do
            set -- "$pathname"/*
            if [ "$#" -gt 1000 ]; then
                printf "%d\t%s\n" "$#" "$pathname"
            fi
        done' bash {} +

这会扩展*每个找到的目录中的 shell glob,如果目录中的名称超过 1000 个,则输出该目录的路径名以及名称数量。它通过bash为批量目录执行一个简短的脚本来实现这一点。该脚本将循环遍历每批目录,并且对于每个目录,它将扩展*其中的 glob 以计算条目数。如果合适的话if,就会触发一条语句printf

请注意,如果目录包含百万*名称,那么实际扩展该目录中的 glob可能需要一些时间。

答案2

在 GNU 系统上

(export LC_ALL=C
  find /grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache -print0 |
    tr '\n\0' '\0\n' |
    sed 's|/[^/]*$||' |
    sort |
    uniq -c |
    sort -rn |
    head |
    tr '\z' '\n')

将列出条目最多的 10 个目录。

如果目录中有太多文件,甚至列出它们都太昂贵,您可以尝试通过查看它们的大小来猜测它们,而无需输入它们。

 find /grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache -type d \
   -size +10000000c -print -prune

会列出大于 10MB 的目录并且不会进入它们。

相关内容