Answers:
我发现它du --inodes
很有用,但是我不确定du
它需要哪个版本。在Ubuntu 17.10上,以下工作:
du --inodes # all files and subdirectories
du --inodes -s # summary
du --inodes -d 2 # depth 2 at most
与结合| sort -nr
按包含inode的数量降序排序。
最简单的方法似乎是 find /path/to/search -ls | wc -l
查找用于遍历所有文件和文件夹。
-ls
列出(打印)所有名称。这是默认设置,如果您不使用它,它将在几乎所有系统上仍然可以使用。(几乎,因为有些可能具有不同的默认值)。不过,明确使用它是一个好习惯。
如果仅使用该find /path/to/search -ls
部件,它将在屏幕上打印所有文件和目录。
wc
是字数。该-l
选项告诉它计算行数。
您可以通过多种方式使用它,例如
第一个选项使wc打开文件并计算该文件中的行数,单词数和字符数。第二个选项执行相同的操作,但是没有文件名,它从stdin读取。
您可以将命令与管道组合在一起|
。第一个命令的输出将通过管道传递到第二个命令的输入。因此,find /path/to/search -ls | wc -l
使用find列出所有文件和目录,并将输出提供给wc。然后,Wc计算行数。
(另一种选择是`ls | wc',但是find更加灵活并且是学习的好工具。)
[评论后编辑]
结合查找和执行可能是有用的。
例如,find / -type d ! \( -path proc -o -path dev -o -path .snap \) -maxdepth 1 -exec echo starting a find to count to files in in {} \;
将在/中列出所有目录,并禁止一些您不想搜索的目录。我们可以在每个命令上触发前一个命令,从而在/中产生每个文件夹的文件总数。
然而:
以下PHP脚本可以解决问题。
#!/usr/bin/php
<?php
function do_scan($dir, $dev) {
$total = 1;
if (\filetype($dir) === 'dir' && \lstat($dir)['dev'] == $dev) {
foreach (\scandir($dir) as $file) {
if ($file !== '.' && $file !== '..') {
$total += do_scan($dir . \DIRECTORY_SEPARATOR . $file, $dev);
}
}
print "$total\t$dir\n";
}
return $total;
};
foreach (\array_slice($argv, 1) as $arg) {
do_scan($arg, \lstat($arg)['dev']);
}
将其放入文件(例如“ treesize
”)中,chmod +x
然后使用运行./treesize . | sort -rn | less
。
du
,这仅是计算而不是累加大小,这恰好是原始问题的要求。
利用dirs和文件由分隔的事实/
。该脚本确实符合您的条件,但是可以激发一个完整的解决方案。您还应该考虑使用locate为文件建立索引。
geee: /R/tb/tmp
$ find 2>/dev/null | awk -F/ -f filez | sort -n
files: 57
3 imagemagick
7 portage
10 colemak-1.0
25 minpro.com
42 monolith
80 QuadTree
117 themh
139 skyrim.stings
185 security-howto
292 ~t
329 skyrim
545 HISTORY
705 minpro.com-original
1499 transmission-2.77
23539 ugent-settings
>
$ cat filez
{
a[$2]++; # $1= folder, $2 = everything inside folder.
}
END {
for (i in a) {
if (a[i]==1) {files++;}
else { printf "%d\t%s\n", a[i], i; }
}
print "files:\t" files
}
>
$ time locate / | awk -F/ -f /R/tb/tmp/filez | sort -n
files: 13
2
2 .fluxbox
10 M
11 BIN
120 bin
216 sbin
234 boot
374 R
854 dev
1351 lib
2018 etc
9274 media
30321 opt
56516 home
93625 var
222821 usr
351367 mnt
time: Real 0m17.4s User 0m4.1s System 0m3.1s
这是一个使用bash的解决方案,灵感来自Unix&Linux。
find . -type d | while read -r dir; do \
printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
如果您不想看到某些文件夹的详细信息(例如).git
,可以使用将该文件夹从列表中排除grep
。
find . -type d |grep -v "./.git/.*" | while read -r dir; do \
printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done