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

Jes*_*sse 22 linux disk-space file-management filesystems du

我正在尝试清理多年来积累的各种垃圾的硬盘驱动器。du有助于减少磁盘使用量,但整个事情仍然很笨拙,不是因为总大小,而是因为文件和目录的总数。

有没有办法我可以做一些类似du但不计算文件大小的事情,而是计算文件和目录的数量?例如:一个文件是1,一个目录是它里面的文件/目录的递归数+1。

编辑:我应该更清楚。我想不仅知道的文件/目录总数/,而且在/home/usr等,并在其子目录,递归,如du确实为大小。

krl*_*mlr 22

我发现它du --inodes很有用,但我不确定du它需要哪个版本。在 Ubuntu 17.10 上,以下工作:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most
Run Code Online (Sandbox Code Playgroud)

结合使用| sort -nr以按包含 inode 的数量降序排序。


Hen*_*nes 11

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

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

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


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

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

  • 厕所测试文件
  • 猫测试文件| 厕所

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


您可以使用管道组合命令|。第一个命令的输出将通过管道传输到第二个命令的输入。因此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. 我怀疑您实际上可能需要每个子目录的多个 fo 文件。


小智 9

ncdu非常适合这个!

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

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

例如:

数控输出


Jes*_*sse 4

下面的 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']);
}
Run Code Online (Sandbox Code Playgroud)

将其放入文件中(例如“ treesize”),chmod +x然后使用./treesize . | sort -rn | less.