du 计算文件/目录的数量而不是大小

du 计算文件/目录的数量而不是大小

我正在尝试清理多年来积累了各种垃圾的硬盘。du虽然它有助于减少磁盘使用量,但整个系统仍然难以处理,这并不是因为总大小,而是因为文件和目录的总数太多。

有没有办法可以做类似的事情du,但不计算文件大小,而是计算文件和目录的数量?例如:文件为 1,目录为其中文件/目录的递归数量 + 1。

编辑:我应该说得更清楚一点。我不仅想知道 中的文件/目录总数/,还想知道 等中的/home文件/目录总数/usr以及它们的子目录中的文件/目录总数,就像du对大小所做的那样。

答案1

我发现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 数量降序排序。

答案2

最简单的方法似乎是find /path/to/search -ls | wc -l

Find 用于遍历所有文件和文件夹。
-ls列出(打印)所有名称。这是默认设置,如果您省略它,它仍然可以在几乎所有系统中正常工作。(几乎,因为有些可能有不同的默认值)。不过,明确使用它是个好习惯。

如果您只使用该find /path/to/search -ls部分,它会将所有文件和目录打印到您的屏幕上。


wc是字数统计。该-l选项告诉它计算行数。

你可以通过多种方式使用它,例如

  • wc 测试文件
  • cat 测试文件 | wc

第一个选项让 wc 打开一个文件并计算该文件中的行数、单词数和字符数。第二个选项执行相同操作,但没有文件名,它会从 stdin 读取。


您可以使用管道将命令组合起来|。第一个命令的输出将通过管道传输到第二个命令的输入。因此find /path/to/search -ls | wc -l使用 find 列出所有文件和目录并将输出提供给 wc。然后 Wc 计算行数。

(另一个选择是“ls | wc”,但 find 更加灵活,并且是一种值得学习的好工具。)


[评论后编辑]

将 find 和 exec 结合起来可能会很有用。

例如,find / -type d ! \( -path proc -o -path dev -o -path .snap \) -maxdepth 1 -exec echo starting a find to count to files in in {} \;将列出 / 中的所有目录,删除一些您不想搜索的目录。我们可以在每个目录上触发上一个命令,从而得出 / 中每个文件夹的文件总数。

然而:

  1. 这使用了 GNU 特定扩展 -maxdepth。
    它可以在 Linux 上运行,但不能在任何类似 unix 上运行。
  2. 我怀疑您可能实际上想要每个子目录的多个文件。

答案3

北卡罗莱纳大学非常适合这个!

从手册页中,您可以显示每个目录的计数并按计数排序:

[...]
KEYS
       C   Order by number of items (press again for descending order)
[...]
       c   Toggle display of child item counts.

例如:

ncdu 输出

答案4

利用目录和文件之间用 分隔的事实/。此脚本无法满足您的标准,但可以启发完整的解决方案。您还应该考虑使用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

相关内容