![如何找到最大的(按条目数,而不是按大小) ext4 目录?](https://linux22.com/image/592180/%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E6%9C%80%E5%A4%A7%E7%9A%84%EF%BC%88%E6%8C%89%E6%9D%A1%E7%9B%AE%E6%95%B0%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AF%E6%8C%89%E5%A4%A7%E5%B0%8F%EF%BC%89%20ext4%20%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
Ubuntu 10.04.3 LTS x86_64,我看到以下内容/var/log/messages
:
EXT4-fs warning (device sda3): ext4_dx_add_entry: Directory index full!
dumpe2fs 的相关信息:
Filesystem features: has_journal ext_attr resize_inode dir_index filetype
needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg
dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Free blocks: 165479247
Free inodes: 454382328
Block size: 2048
Inode size: 256
我已经阅读了一些其他问题,例如ext3_dx_add_entry:目录索引已满和rm 包含数百万个文件的目录;这些让我想到某处一定有一个包含大量项目的目录。
由于它是一个相当复杂的目录组织,我有一个基本问题:如何找到生成这些消息的目录?
答案1
以下一行代码将列出每个目录中有多少个文件,并按前十名排序。它将从您当前的工作目录递归运行,因此我不建议您从 / 运行它,除非您完全不知道大型目录可能在哪里。
find . -type f | awk '{dir=gensub(/(.+\/).+/,"\\1","g (file://1%22,%22g/)"); dir_list[dir]++} END {for (d in dir_list) printf "%s %s\n",dir_list[d],d}d' | sort -nr |head
输出将类似于以下内容:
[user@localhost ~]# find . -type f | awk '{dir=gensub(/(.+\/).+/,"\\1","g (file://1%22,%22g/)"); dir_list[dir]++} END {for (d in dir_list) printf "%s %s\n",dir_list[d],d}d' | sort -nr | head
2048 ./test19/
2048 ./test18/
2048 ./test17/
2048 ./test16/
2048 ./test15/
2048 ./test14/
2048 ./test13/
2048 ./test12/
2048 ./test11/
2048 ./test10/
如果您对运行这样的一行命令有点担心,只需搜索所有大小超过 50k 左右的目录即可。 find 再次成为您的好朋友:
find ./ -type d -size +50k
如果您有多个挂载点,df -i 将帮助您缩小哪个挂载点正在耗尽或已经耗尽 inode。
答案2
在命令的 -exec 部分使用 sh,您可以启动另一个 shell 并在其中顺利运行命令。
查找 . -name "*.dat" -exec csh -c ‘echo -n $1; grep ID $1 | wc -l’ {} {} \;
或者在我的情况下,当计算目录中的文件数时。我使用“ls -f”,因为它会产生未排序的 ls 输出,这比在计算之前尝试对输出进行排序要快得多。
目录名称和目录数之间有换行符
查找 /somedir/some/dir -type d -print -exec sh -c ' ls -f $1/* | wc -l' {} {} \;
目录名称和计数之间用制表符分隔
查找 /somedir/some/dir -type d -exec bash -c'echo -en“$1\t”; ls -f $1/* | wc -l'{} {} \;
http://www.compuspec.net/reference/os/solaris/find/find_and_execute_with_pipe.shtml