如何找出哪些目录负责咀嚼所有inode?我的inode在哪里被使用?
最终的根目录将负责inode的数量最多,所以我不知道到底什么样的答案,我想的..
基本上,我跑出来的inode可用的和需要找到一个不需要的目录来剔除。
谢谢,并且对于模糊的问题感到抱歉。
如何找出哪些目录负责咀嚼所有inode?我的inode在哪里被使用?
最终的根目录将负责inode的数量最多,所以我不知道到底什么样的答案,我想的..
基本上,我跑出来的inode可用的和需要找到一个不需要的目录来剔除。
谢谢,并且对于模糊的问题感到抱歉。
所以基本上你在寻找哪些目录有很多文件?下面是它的第一刺:
find . -type d -print0 | xargs -0 -n1 count_files | sort -n
其中 “count_files” 是一个shell脚本,它(感谢乔纳森)
echo $(ls -a "$1" | wc -l) $1
这里有一个简单的Perl脚本,它会做到这一点:
#!/usr/bin/perl -w
use strict;
sub count_inodes($);
sub count_inodes($)
{
my $dir = shift;
if (opendir(my $dh, $dir)) {
my $count = 0;
while (defined(my $file = readdir($dh))) {
next if ($file eq '.' || $file eq '..');
$count++;
my $path = $dir . '/' . $file;
count_inodes($path) if (-d $path);
}
closedir($dh);
printf "%7d\t%s\n", $count, $dir;
} else {
warn "couldn't open $dir - $!\n";
}
}
push(@ARGV, '.') unless (@ARGV);
while (@ARGV) {
count_inodes(shift);
}
如果你想让它像du
一样工作(其中每个目录计数也包括子目录的递归计数),那么将递归函数改为return $count
,然后在递归点说:
$count += count_inodes($path) if (-d $path);
如果你不想做一个新文件(或不能,因为你跑出来的inode),您可以运行此查询:
for i in `find . -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n
内幕提到在另一个答案中,使用find方法会更快,因为递归ls非常慢,请查看下面的解决方案! (信贷到期信贷!)
提供递归方法ls非常缓慢。 只是为了快速找到最消耗inode的父目录我用:
cd /partition_that_is_out_of_inodes
for i in *; do echo -e "$(find $i | wc -l)\t$i"; done | sort -n
for i in dir.[01] do find $i -printf "%i\n"|sort -u|wc -l|xargs echo $i -- done
dir.0 - 27913
dir.1 - 27913
perl脚本是好的,但要小心符号链接 - 只有当-l filetest返回false时,才会递归,否则你最多只会重复计数,最坏的情况是无限期地递归(这可能会引起微小的担忧 - 引发撒旦1000年的统治)。
当有多个链接指向文件系统树中超过一小部分文件时,在文件系统树中统计inode的整体思路就会崩溃。
只是想提一提,你也可以搜索间接使用目录的大小,例如:
find /path -type d -size +500k
在哪里,如果你有很多的大型目录500K可以增加。
请注意,此方法是而不是递归。这只会帮助你,如果你有一个单一的目录很多文件,但不是如果文件均匀分布在其后代。
这是我的承担。它与其他人没有太大的区别,但输出结果很好,我认为它比其他的(目录和符号链接)更有效的inode。这会计算工作目录的每个子目录中的文件数量;它将输出分类并格式化为两列;并打印总计(显示为“。”,工作目录)。这不会遵循符号链接,但会计算以点开头的文件和目录。这不会计算设备节点和特殊文件,如命名管道。如果你想要计算这些,就删除“-type l -o -type d -o -type f”测试。由于该命令被拆分为两个查找命令,因此无法正确区分安装在其他文件系统上的目录(-mount选项不起作用)。例如,这应该真的忽略“/ proc”和“/ sys”目录。你可以看到,在包含“/ proc”和“/ sys”的“/”中运行该命令会严重扭曲总计数。
for ii in $(find . -maxdepth 1 -type d); do
echo -e "${ii}\t$(find "${ii}" -type l -o -type d -o -type f | wc -l)"
done | sort -n -k 2 | column -t
例子:
# cd/
# for ii in $(find -maxdepth 1 -type d); do echo -e "${ii}\t$(find "${ii}" -type l -o -type d -o -type f | wc -l)"; done | sort -n -k 2 | column -t
./boot 1
./lost+found 1
./media 1
./mnt 1
./opt 1
./srv 1
./lib64 2
./tmp 5
./bin 107
./sbin 109
./home 146
./root 169
./dev 188
./run 226
./etc 1545
./var 3611
./sys 12421
./lib 17219
./proc 20824
./usr 56628
. 113207
此命令在极不可能的情况下工作,其中目录结构是相同的地雷:
find/-type f | grep -oP '^/([^/]+/){3}' | sort | uniq -c | sort -n
只是注意,当你终于找到了一些邮件假脱机目录并且想要删除那里的所有垃圾,如果文件太多,rm *将不起作用,您可以运行以下命令以quic KLY在该目录中删除一切:
*警告*这将删除所有FILES迅速针对当RM不起作用
find . -type f -delete
我用下面摸出(有一点帮助来自我的同事James)说我们有大量的PHP会话文件需要在一台机器上删除:
1.我有多少个inode被使用?
[email protected]:/# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/xvda1 524288 427294 96994 81%/
none 256054 2 256052 1% /sys/fs/cgroup
udev 254757 404 254353 1% /dev
tmpfs 256054 332 255722 1% /run
none 256054 3 256051 1% /run/lock
none 256054 1 256053 1% /run/shm
none 256054 3 256051 1% /run/user
2.如果是那些索引节点?
[email protected]:/# find/-xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n
[...]
1088 /usr/src/linux-headers-3.13.0-39/include/linux
1375 /usr/src/linux-headers-3.13.0-29-generic/include/config
1377 /usr/src/linux-headers-3.13.0-39-generic/include/config
2727 /var/lib/dpkg/info
2834 /usr/share/man/man3
416811 /var/lib/php5/session
[email protected]:/#
这是最后一行的很多PHP会话文件。
3.如何删除所有这些文件?
删除其中的1440分钟(24小时)年长的目录中的所有文件:
[email protected]:/var/lib/php5/session# find ./ -cmin +1440 | xargs rm
[email protected]:/var/lib/php5/session#
4.具有它的工作?
[email protected]:~# find/-xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n
[...]
1088 /usr/src/linux-headers-3.13.0-39/include/linux
1375 /usr/src/linux-headers-3.13.0-29-generic/include/config
1377 /usr/src/linux-headers-3.13.0-39-generic/include/config
2727 /var/lib/dpkg/info
2834 /usr/share/man/man3
2886 /var/lib/php5/session
[email protected]:~# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/xvda1 524288 166420 357868 32%/
none 256054 2 256052 1% /sys/fs/cgroup
udev 254757 404 254353 1% /dev
tmpfs 256054 332 255722 1% /run
none 256054 3 256051 1% /run/lock
none 256054 1 256053 1% /run/shm
none 256054 3 256051 1% /run/user
[email protected]:~#
幸运的是我们有一个意义上的警报向我们发送电子邮件,我们的inode几乎用完。
的实际功能的一行(GNU发现,对于其他类型的找到你需要自己的-xdev
相当于留在同一个FS的。)
find/-xdev -type d | while read -r i; do printf "%d %s\n" $(ls -a "$i" | wc -l) "$i"; done | sort -nr | head -10
尾巴,显然,可定制。
与此处的许多其他建议一样,这将只显示每个目录中的条目数量,无递归。
P.S.
快,但不精确的一行(由目录节点尺寸检测):
find/-xdev -type d -size +100k
此计算当前目录下的文件。即使文件名包含换行符,这也应该起作用。它使用GNU Awk。改变d的值以获得想要的最大分离路径深度。 0表示无限深度。
find . -mount -not -path . -print0 | gawk -v d=2 '
BEGIN{RS="\0";FS="/";SUBSEP="/";ORS="\0"}
{
s="./"
for(i=2;i!=d+1 && i<NF;i++){s=s $i "/"}
++n[s]
}
END{for(val in n){print n[val] "\t" val "\n"}}' | sort -gz -k 1,1
同样由Bash 4;这是我的经验显著慢:
declare -A n;
d=2
while IFS=/ read -d $'\0' -r -a a; do
s="./"
for ((i=2; i!=$((d+1)) && i<${#a[*]}; i++)); do
s+="${a[$((i-1))]}/"
done
((++n[\$s]))
done < <(find . -mount -not -path . -print0)
for j in "${!n[@]}"; do
printf '%i\t%s\n\0' "${n[$j]}" "$j"
done | sort -gz -k 1,1
使用
ncdu -x <path>
然后按Shitf + c。通过项目分类数量在产品文件
哇,人已经不多了inode的?从Usenet诞生的那一天起,我就没有看到过,因为Usenet新闻短片有很多很小的小文件,所以你必须给mkfs一个参数来使它更多的inode。 – 2008-12-07 14:24:59
是的 - 当然是对过去时光的回忆。 – 2008-12-07 15:47:20
我想这就像是说,“哇,你溢出了堆栈,而且这些日子里有很多可用的内存”。这经常有一个很好的原因(特别是脚本或目录),这就是OP正在寻找的东西。 – gbarry 2008-12-07 19:00:35