当前位置:  开发笔记 > 编程语言 > 正文

我的所有inode都在哪里使用?

如何解决《我的所有inode都在哪里使用?》经验,为你挑选了6个好方法。

如何找出哪些目录负责咀嚼我的所有inode?

最终根目录将负责最大数量的inode,所以我不确定我想要什么样的答案..

基本上,我用完了可用的inode,需要找到一个不需要的目录来剔除.

谢谢,抱歉这个模糊的问题.



1> Hannes..:

如果您不想创建新文件(或因为用完了inode而无法创建),则可以运行此查询:

for i in `find . -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n

作为内部人员在另一个答案中提到,使用find的解决方案会更快,因为递归ls很慢,请检查下面的解决方案!(信用到期!)


这应该是正确的答案,好像你没有任何更多的inode,你不能在Paul的答案中创建shell脚本......

2> insider..:

提供递归ls的方法非常慢.只是为了快速找到父目录消耗我使用的大多数inode:

cd /partition_that_is_out_of_inodes
for i in *; do echo -e "$(find $i | wc -l)\t$i"; done | sort -n


没有`| 排序-n`部分,只使用`for i in*; 做echo -e"$(找$ i | wc -l)\ t $ i"; 完成.我发现它更好,因为每个文件夹的结果一旦知道就会输出,而不是等到最后才对结果进行排序.这为命令的进展提供了更具互动性的体验和反馈

3> Paul Tomblin..:

所以基本上你在寻找哪些目录有很多文件?这是对它的第一次尝试:

find . -type d -print0 | xargs -0 -n1 count_files | sort -n

其中"count_files"是一个shell脚本(感谢Jonathan)

echo $(ls -a "$1" | wc -l) $1



4> Sam Critchle..:

我使用以下内容(在我的同事James的帮助下)得到了大量的PHP会话文件,需要在一台机器上删除:

1.我使用了多少个inode?

 root@polo:/# 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.所有这些inode在哪里?

 root@polo:/# 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
 root@polo:/#

这是最后一行的很多PHP会话文件.

3.如何删除所有这些文件?

删除目录中超过1440分钟(24小时)的所有文件:

root@polo:/var/lib/php5/session# find ./ -cmin +1440 | xargs rm
root@polo:/var/lib/php5/session#

它有效吗?

 root@polo:~# 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
 root@polo:~# 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
 root@polo:~#

幸运的是,我们通过电子邮件向我们发送了一个警告,我们的inode几乎用完了.



5> Noah Spurrie..:

这是我的看法.它与其他人没那么不同,但输出很漂亮,我认为它比其他(目录和符号链接)更有效.这计算工作目录的每个子目录中的文件数; 它将输出分类并格式化为两列; 并打印一个总计(显示为".",工作目录).这不会遵循符号链接,但会计算以点开头的文件和目录.这不会计算设备节点和特殊文件,如命名管道.如果你想计算那些,只需删除"-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



6> Alnitak..:

这是一个简单的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);

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有