如何找出哪些目录负责咀嚼我的所有inode? p>
最终根目录将负责最大数量的inode,所以我不确定我想要什么样的答案..
基本上,我的可用inode用完了,需要找到一个不需要的目录来剔除。
谢谢,对于这个模糊的问题感到抱歉。
答案 0 :(得分:82)
如果您不想创建新文件(或因为用完了inode而无法创建新文件),则可以运行此查询:
for i in `find . -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n
作为内部人员在另一个答案中提到,使用find的解决方案会更快,因为递归ls非常慢,请在下面查看该解决方案! (信用到期!)
答案 1 :(得分:38)
提供递归 ls 的方法非常慢。 只是为了快速找到父目录消耗我使用的大多数inode:
cd /partition_that_is_out_of_inodes
for i in *; do echo -e "$(find $i | wc -l)\t$i"; done | sort -n
答案 2 :(得分:20)
所以基本上你在寻找哪些目录有很多文件?这是对它的第一次尝试:
find . -type d -print0 | xargs -0 -n1 count_files | sort -n
其中“count_files”是一个shell脚本(感谢Jonathan)
echo $(ls -a "$1" | wc -l) $1
答案 3 :(得分:12)
我使用以下方法(在我的同事James的帮助下)确定我们有大量的PHP会话文件需要在一台机器上删除:
<强> 1。我使用了多少个inode? strong>
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#
<强> 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:~#
幸运的是,我们通过电子邮件发送了一封警告,告诉我们我们的inode几乎已用完了。
答案 4 :(得分:10)
这是我的看法。它与其他人没那么不同,但输出很漂亮,我认为它比其他(目录和符号链接)更有效。这计算工作目录的每个子目录中的文件数;它将输出分类并格式化为两列;并打印一个总计(显示为“。”,工作目录)。这不会遵循符号链接,但会计算以点开头的文件和目录。这不会计算设备节点和特殊文件,如命名管道。如果你想计算那些,只需删除“-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
答案 5 :(得分:6)
这是一个简单的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);
答案 6 :(得分:3)
实际功能性单行(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
答案 7 :(得分:1)
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
答案 8 :(得分:1)
使用
BINPREF
然后按Shitf + c按项目为文件的项目计数
答案 9 :(得分:0)
perl脚本很好,但要注意符号链接 - 仅当-l filetest返回false时才会递归,否则你最多会过度计数,最坏的情况是无限期递归(这可能是次要问题 - 调用撒旦的1000年统治时间)。 / p>
当存在超过一小部分文件的多个链接时,计算文件系统树中的inode的整个想法就会崩溃。
答案 10 :(得分:0)
只是想提一下,你也可以使用目录大小间接搜索 ,例如:
find /path -type d -size +500k
如果您有很多大型目录,可以增加500k。
请注意,此方法不递归。如果您在一个目录中有大量文件,这只会对您有所帮助,但如果文件在其后代中均匀分布,则无法帮助您。
答案 11 :(得分:0)
请注意,当你最终找到一些邮件假脱机目录并希望删除其中的所有垃圾时,如果文件太多,rm *将无效,你可以运行以下命令快速删除其中的所有内容目录:
*警告* 如果rm不工作,这将快速删除所有文件
find . -type f -delete
答案 12 :(得分:0)
这会计算当前目录下的文件。即使文件名包含换行符,这也应该有效。它使用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
答案 13 :(得分:0)
当搜索占用磁盘空间最多的文件夹时,我曾经像这样du
上下使用
du -hs /*
这是列出每个顶级文件夹的文件使用情况。然后,您可以通过扩展给定的模式进入任意一个文件夹:
du -hs /var/*
以此类推...
现在,对于inode,可以使用带有稍微不同的参数的相同工具:
du -s --inodes /*
有一个缓存可以改善此工具在同一文件夹中的后续调用,这在通常情况下是有益的。但是,当您用尽inode时,我认为这将变成相反的情况。
答案 14 :(得分:-1)
此命令适用于您的目录结构与我的目录结构相同的极不可能的情况:
find / -type f | grep -oP '^/([^/]+/){3}' | sort | uniq -c | sort -n