linux 根目录的inode,linux-我的所有inode都在哪里使用?

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

我如何找出哪个目录负责修剪所有索引节点?

最终,根目录将负责最多数量的inode,因此我不确定到底要什么样的答案。

基本上,我的可用索引节点用完了,需要找到一个不需要的目录来删除。

谢谢,对于这个模糊的问题,我们深表歉意。

Joel asked 2020-01-07T02:19:56Z

14个解决方案

82 votes

如果您不想创建一个新文件(或者因为您用尽了inode而不能),则可以运行以下查询:

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

正如另一个答案中的内部人员所述,由于递归ls相当慢,因此使用带有find的解决方案会更快,请查看下面的解决方案! (信用额度归功!)

Hannes answered 2020-01-07T02:20:34Z

41 votes

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

cd /partition_that_is_out_of_inodes

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

insider answered 2020-01-07T02:20:53Z

20 votes

因此,基本上,您正在寻找哪个目录中包含很多文件? 这是第一个刺伤:

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

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

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

Paul Tomblin answered 2020-01-07T02:20:09Z

12 votes

我使用以下内容来解决(在我的同事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.这些索引节点都在哪里?

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#

4.它奏效了吗?

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:~#

幸运的是,我们有一个sensu警报通过电子邮件发送给我们,通知说我们的inode快用完了。

Sam Critchley answered 2020-01-07T02:21:44Z

10 votes

这是我的看法。 它与其他人没有太大区别,但是输出很漂亮,我认为它比其他人(目录和符号链接)计数的有效inode数量更多。 这将计算工作目录的每个子目录中的文件数; 它将输出排序并格式化为两列; 并打印总计(显示为“。”,工作目录)。 这不会跟随符号链接,但会计算以点开头的文件和目录。 这不包括设备节点和特殊文件(如命名管道)。 如果您也想计算这些,只需删除“ -type l -o -type d -o -type f”测试。 由于此命令分为两个find命令,因此无法正确区分安装在其他文件系统上的目录(-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

Noah Spurrier answered 2020-01-07T02:22:10Z

6 votes

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

Alnitak answered 2020-01-07T02:22:34Z

4 votes

一个实际可用的单线(GNU查找,对于其他类型的查找,您需要自己等效的find / -xdev -type d -size +100k才能保留在同一FS上。)

find / -xdev -type d -size +100k

尾巴显然是可定制的。

与此处的许多其他建议一样,这只会以非递归方式显示每个目录中的条目数量。

附言

快速但不精确的单行代码(通过目录节点大小检测):

find / -xdev -type d -size +100k

AnrDaemon answered 2020-01-07T02:23:21Z

1 votes

for i in dir.[01]

do

find $i -printf "%i\n"|sort -u|wc -l|xargs echo $i --

done

dir.0-27913

目录1-27913

AndrewM at Affinity answered 2020-01-07T02:23:45Z

1 votes

采用

ncdu -x

然后按Shift + c键以按项目计数排序项目在文件中的位置

LPby answered 2020-01-07T02:24:09Z

0 votes

perl脚本很好,但是要注意符号链接-仅在-l filetest返回false时进行递归,否则您最多将无限计数,最坏的情况是无限期递归(这可能会引起小麻烦-调用Satan的1000年统治)。

当有多个链接指向多个文件时,对文件系统树中的inode进行计数的整个想法就会瓦解。

stinkoid answered 2020-01-07T02:24:33Z

0 votes

只是想提一下,您也可以使用目录大小间接搜索,例如:

find /path -type d -size +500k

如果您有很多大目录,则可以增加500k。

请注意,此方法不是递归的。 仅当在一个目录中有许多文件时,这才有帮助,但如果文件在其后代中均匀分布,则无济于事。

Romuald Brunet answered 2020-01-07T02:25:02Z

0 votes

请注意,当您最终找到某个邮件假脱机目录并想要删除其中的所有垃圾时,如果文件太多,rm *将不起作用,您可以运行以下命令来快速删除该目录中的所有内容:

*警告*如果无法使用rm,这会在某些情况下迅速删除所有文件

find . -type f -delete

CO4 Computing answered 2020-01-07T02:25:27Z

0 votes

这将计数当前目录下的文件。 即使文件名包含换行符,这也应该起作用。 它使用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

++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

s+="${a[$((i-1))]}/"

done

((++n[\$s]))

done <

for j in "${!n[@]}"; do

printf '%i\t%s\n\0' "${n[$j]}" "$j"

done | sort -gz -k 1,1

jarno answered 2020-01-07T02:25:52Z

-2 votes

此命令在目录结构与我的目录结构完全相同的极少数情况下有效:

find / -type f | grep -oP '^/([^/]+/){3}' | sort | uniq -c | sort -n

sanxiago answered 2020-01-07T02:26:16Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值