文件夹下
/grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache
我们有 100 多个递归文件夹。
其中一个文件夹包含数千个文件。可以识别这个文件夹吗?
我这么问是因为这个文件夹包含数千个文件,而我们可能会遇到一个问题,因为有数千个文件,我们无法删除其中的文件。
答案1
目录中的项目数可以使用以下方式进行计数
set -- *
这会将位置参数( 、 等)设置$1
为$2
当前目录中的名称。扩展后的名称数量*
可在 中找到$#
。如果您使用bash
shell 并设置dotglob
shell 选项,则会额外计算隐藏名称。
使用它来查找/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 的目录并且不会进入它们。