web-dev-qa-db-fra.com

DU qui compte le nombre de fichiers / répertoires plutôt que de taille

J'essaie de nettoyer un disque dur qui a toutes sortes de merde accumulées au fil des ans. du a aidé à réduire l'utilisation du disque, mais tout cela n'est toujours pas dû à la taille totale, mais en raison du nombre de fichiers et de répertoires au total.

Y a-t-il une façon de faire quelque chose comme du mais ne pas compter la taille du fichier, mais plutôt le nombre de fichiers et de répertoires? Par exemple: un fichier est 1, et un répertoire est le nombre récursif de fichiers/répertoires à l'intérieur + 1.

Edit : J'aurais dû être plus clair. J'aimerais non seulement connaître le nombre total de fichiers/répertoires dans /, mais aussi dans /home, /usr etc, et dans leurs sous-répertoires, de manière récursive, comme du fait la taille.

13
Jesse

Le suivant PHP script fait l'affaire.

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

Mettre cela dans un fichier (dire, "treesize"), chmod +x ça et le gérer avec ./treesize . | sort -rn | less.

4
Jesse

J'ai trouvé du --inodes utile, mais je ne suis pas sûr de quelle version de du cela nécessite. Sur Ubuntu 17.10, les travaux suivants:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

Combiner avec | sort -nr Pour trier des descentes par le nombre de contenant des inodes.

11
krlmlr

NCD est super pour cela!

À partir de la page Man, vous pouvez afficher des comptes par répertoire et par commande par compte également:

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

Par exemple:

ncdu output

2
jobevers

Exploiter le fait que les DIRS et les fichiers sont séparés par /. Ce script fait chaud répond à vos critères, mais sert à inspirer une solution complète. Vous devez également envisager d'indexer vos fichiers avec localisation.

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