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


13

我正在尝试清理多年来积累了各种废话的硬盘驱动器。du虽然有助于减少磁盘使用量,但总的来说,这并不是很笨拙,这并不是由于总大小,而是由于文件和目录的总数非常大。

有什么办法可以执行类似du但不计算文件大小,而是计算文件和目录数量的方法吗?例如:一个文件是1,而目录是其中的文件/目录的递归数+ 1。

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


2
认为您可能正在寻找类似答案的略微修改版本的内容superuser.com/questions/198817/…–
James

Answers:


11

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


1
这看起来比接受的答案更像我想要的东西。
Sridhar Sarnobat '19

8

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

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

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


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

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

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

第一个选项使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 {} \;将在/中列出所有目录,并禁止一些您不想搜索的目录。我们可以在每个命令上触发前一个命令,从而在/中产生每个文件夹的文件总数。

然而:

  1. 这使用了GNU特定的扩展名-maxdepth。
    它可以在Linux上运行,但不能在任何unix-a-like上运行。
  2. 我怀疑您实际上可能希望每个子目录都有多个fo文件。

抱歉,不仅是一个级别,而且是所有级别(这就是我在编辑中“递归”的意思)。
杰西

而不是exec echo会触发查找| wc每个目录。我知道这是有可能的,但我似乎无法发现今天的情况。我想我总是会犯同样的错误。*去煮咖啡*。
Hennes

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']);
}

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


为什么这是公认的答案?您假设php在计算机上,但情况并非总是如此。该脚本未记录且没有特定内容。虽然可以在SE上回答您自己的问题,但该答案甚至不能提供您自己问题的答案;或您没有在问题发生时问您想到的问题...不幸的是我无法投票赞成,我只想指出一点...还是很糟糕的答案!
user1810087 '18

如果不假定已安装该语言的解释器,则无法用任何语言编写脚本。该脚本以递归方式打印每个目录下文件和目录的总数。因此du,这仅是计算而不是累加大小,这恰好是原始问题的要求。
杰西

2

ncdu对此非常有用

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

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

例如:

ncdu输出


1

利用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

2
为什么在/中有.fluxbox?:d
ЯрославРахматуллин

1

这是一个使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.