du che conta il numero di file / directory anziché le dimensioni


13

Sto cercando di ripulire un disco rigido che ha accumulato ogni sorta di schifezze negli anni. duha contribuito a ridurre l'utilizzo del disco, ma il tutto è ancora ingombrante non a causa delle dimensioni totali, ma a causa del numero assoluto di file e directory in totale.

C'è un modo in cui posso fare qualcosa di simile duma non contare le dimensioni del file, ma piuttosto il numero di file e directory? Ad esempio: un file è 1 e una directory è il numero ricorsivo di file / directory al suo interno + 1.

Modifica: avrei dovuto essere più chiaro. Vorrei non solo conoscere il numero totale di file / directory in /, ma anche in /home, /usrecc. E nelle loro sottodirectory, ricorsivamente, come dufa per dimensione.


2
Pensa che potresti cercare qualcosa come una versione leggermente modificata delle risposte qui superuser.com/questions/198817/…
James

Risposte:


11

Ho trovato du --inodesutile, ma non sono sicuro di quale versione durichieda. Su Ubuntu 17.10, funziona come segue:

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

Combina con | sort -nrper ordinare in ordine decrescente per numero di inode contenenti.


1
Questo assomiglia molto di più a quello che voglio della risposta accettata.
Sridhar Sarnobat,

8

Il modo più semplice sembra essere find /path/to/search -ls | wc -l

Trova è usato per camminare attraverso tutti i file e le cartelle.
-lsper elencare (stampare) tutti i nomi. Questo è un valore predefinito e se lo lasci fuori funzionerà ancora allo stesso modo quasi tutti i sistemi. (Quasi, poiché alcuni potrebbero avere impostazioni predefinite diverse). È una buona abitudine usare esplicitamente questo però.

Se si utilizza solo la find /path/to/search -lsparte, verranno stampati tutti i file e le directory sullo schermo.


wcè il conteggio delle parole. l' -lopzione dice di contare il numero di righe.

Puoi usarlo in diversi modi, ad es

  • wc testfile
  • file di test gatto | bagno

La prima opzione consente a wc di aprire un file e contare il numero di righe, parole e caratteri in quel file. La seconda opzione fa lo stesso ma senza nome file legge dallo stdin.


Puoi combinare i comandi con una pipe |. L'output del primo comando verrà reindirizzato all'input del secondo comando. Quindi find /path/to/search -ls | wc -lutilizza find per elencare tutti i file e le directory e invia l'output a wc. Wc quindi conta il numero di righe.

(Un'altra alternativa sarebbe stata "ls | wc", ma find è molto più flessibile e un buon strumento per imparare.)


[Modifica dopo commento]

Potrebbe essere utile combinare find e exec.

Ad esempio find / -type d ! \( -path proc -o -path dev -o -path .snap \) -maxdepth 1 -exec echo starting a find to count to files in in {} \;, elencherò tutte le directory in /, a parte alcune che non vuoi cercare. Possiamo attivare il comando precedente su ciascuno di essi, producendo una somma di file per cartella in /.

Però:

  1. Questo utilizza l'estensione specifica GNU -maxdepth.
    Funzionerà su Linux, ma non su qualsiasi unix-a-simili.
  2. Ho il sospetto che potresti davvero desiderare un numero di file per ogni sottodirectory.

Spiacente, non solo un livello di profondità, ma per tutti i livelli (questo è ciò che intendevo per "ricorsivamente" nella mia modifica).
Jesse,

Invece dell'eco exec si innesca una ricerca | WC per ogni dir. So che è possibile, ma non riesco a scoprire come oggi. Immagino di continuare a fare lo stesso errore in qualche modo. * Va a preparare il caffè *.
Hennes,

4

Il seguente script PHP fa il trucco.

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

Inseriscilo in un file (ad esempio " treesize"), chmod +xed eseguilo ./treesize . | sort -rn | less.


Perché questa è la risposta accettata ?! Supponete che php sia sulla macchina, il che non è sempre il caso. Lo script non è documentato e specifico. Sebbene sia giusto rispondere alla tua domanda su SE, questa risposta non fornisce nemmeno una risposta alla tua domanda ; o non hai posto la domanda che avevi in ​​mente quando si è verificato il problema ... Sfortunatamente non posso sottovalutarlo, devo fare qualche punto ... ancora, cattiva risposta!
user1810087

Non riesco a scrivere lo script in nessuna lingua senza supporre che sia installato un interprete per quella lingua. Lo script stampa ricorsivamente il numero totale di file e directory sotto ciascuna directory. Quindi un valore duche conta semplicemente anziché sommare la dimensione, che è esattamente ciò che la domanda originale ha posto.
Jesse,

2

ncdu è fantastico per questo!

Dalla pagina man, puoi mostrare i conteggi per directory e anche l'ordine per conteggi:

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

Per esempio:

uscita ncdu


1

Sfruttare il fatto che dirs e file sono separati da /. Questo script soddisfa i tuoi criteri, ma serve a ispirare una soluzione completa. Dovresti anche considerare di indicizzare i tuoi file con 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
Perché ho .fluxbox in /? : D
Ярослав Рахматуллин

1

Ecco una soluzione che utilizza bash, ispirata a un post di Unix e Linux .

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

Se ci sono alcune cartelle di cui non vuoi vedere i dettagli, ad esempio .git, puoi escluderle dall'elenco con grep.

find . -type d |grep -v "./.git/.*" | while read -r dir; do \
    printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.