du que cuenta el número de archivos / directorios en lugar del tamaño

13

Estoy tratando de limpiar un disco duro que tiene todo tipo de basura acumulada a lo largo de los años. duha ayudado a reducir el uso del disco, pero todo esto no es difícil de manejar debido al tamaño total, sino a la gran cantidad de archivos y directorios en total.

¿Hay alguna manera de hacer algo como, dusin contar el tamaño del archivo, sino el número de archivos y directorios? Por ejemplo: un archivo es 1 y un directorio es el número recursivo de archivos / directorios dentro de él + 1.

Editar: debería haber sido más claro. Me gustaría saber no solo el número total de archivos / directorios /, sino también en /home, /usretc., y en sus subdirectorios, recursivamente, como lo duhace por tamaño.

Jesse
fuente
2
Cree que podría estar buscando algo así como una versión ligeramente modificada de las respuestas aquí superuser.com/questions/198817/…
James

Respuestas:

11

He encontrado du --inodesútil, pero no estoy seguro de qué versión durequiere. En Ubuntu 17.10, funciona lo siguiente:

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

Combinar con | sort -nrpara ordenar descendente por número de inodos que contienen.

krlmlr
fuente
1
Esto se parece mucho más a lo que quiero que a la respuesta aceptada.
Sridhar Sarnobat
8

La forma más fácil parece ser find /path/to/search -ls | wc -l

Buscar se usa para recorrer todos los archivos y carpetas.
-lspara enumerar (imprimir) todos los nombres. Este es un valor predeterminado y si lo deja fuera, seguirá funcionando igual en casi todos los sistemas. (Casi, ya que algunos pueden tener valores predeterminados diferentes). Sin embargo, es una buena costumbre usar esto explícitamente.

Si solo usa la find /path/to/search -lsparte, imprimirá todos los archivos y directorios en su pantalla.


wces el recuento de palabras la -lopción le dice que cuente el número de líneas.

Puede usarlo de varias maneras, p. Ej.

  • wc testfile
  • archivo de prueba de gato | baño

La primera opción le permite a wc abrir un archivo y contar el número de líneas, palabras y caracteres en ese archivo. La segunda opción hace lo mismo pero sin nombre de archivo se lee desde stdin.


Puedes combinar comandos con una tubería |. La salida del primer comando se canalizará a la entrada del segundo comando. Por lo tanto, find /path/to/search -ls | wc -lutiliza find para enumerar todos los archivos y directorios y alimenta la salida a wc. Wc luego cuenta el número de líneas.

(Otra alternativa habría sido 'ls | wc', pero find es mucho más flexible y una buena herramienta para aprender).


[Editar después del comentario]

Puede ser útil combinar el find y el exec.

Por ejemplo find / -type d ! \( -path proc -o -path dev -o -path .snap \) -maxdepth 1 -exec echo starting a find to count to files in in {} \;, enumerará todos los directorios en /, excluirá algunos que no desea buscar. Podemos activar el comando anterior en cada uno de ellos, produciendo una suma de archivos por carpeta en /.

Sin embargo:

  1. Esto usa la extensión específica de GNU -maxdepth.
    Funcionará en Linux, pero no en cualquier unix-a-like.
  2. Sospecho que es posible que desee un número de archivos para cada subdirectorio.
Hennes
fuente
Lo sentimos, no solo un nivel profundo, sino para todos los niveles (eso es lo que quise decir con "recursivamente" en mi edición).
Jesse
En lugar del eco ejecutivo, desencadena un hallazgo | WC para cada directorio. Sé que es posible, pero parece que no puedo descubrir cómo hoy. Supongo que sigo cometiendo el mismo error de alguna manera. * Va a preparar café *.
Hennes
4

El siguiente script PHP hace el truco.

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

Ponlo en un archivo (por ejemplo, " treesize"), chmod +xy ejecútalo con ./treesize . | sort -rn | less.

Jesse
fuente
¿Por qué es esta la respuesta aceptada? Asume que php está en la máquina, lo cual no siempre es el caso. El guión no está documentado y es específico. Si bien está bien responder su propia pregunta en SE, esta respuesta ni siquiera proporciona una respuesta a su propia pregunta ; o no hizo la pregunta que tenía en mente cuando ocurrió el problema ... Desafortunadamente no puedo rechazarlo, tengo algunos puntos ... aún así, ¡mala respuesta!
user1810087
No puedo escribir el script en ningún idioma sin suponer que hay instalado un intérprete para ese idioma. El script imprime el número total de archivos y directorios debajo de cada directorio de forma recursiva. Entonces, dueso simplemente cuenta en lugar de sumar el tamaño, que es exactamente lo que hizo la pregunta original.
Jesse
2

¡ncdu es genial para esto!

Desde la página de manual, puede mostrar los recuentos por directorio y ordenar por recuentos también:

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

Por ejemplo:

salida ncdu

jobevers
fuente
1

Explota el hecho de que los directorios y los archivos están separados por /. Este script cumple con sus criterios, pero sirve para inspirar una solución completa. También debe considerar indexar sus archivos con localizar.

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
Ярослав Рахматуллин
fuente
2
¿Por qué tengo .fluxbox en /? : D
Ррослав Рахматуллин
1

Aquí hay una solución que usa bash, inspirada en una publicación de Unix y Linux .

find . -type d | while read -r dir; do \
    printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done

Si hay algunas carpetas de las que no desea ver los detalles .git, puede excluirlas de la lista con grep.

find . -type d |grep -v "./.git/.*" | while read -r dir; do \
    printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
Don Kirkby
fuente