combina il meglio di "du" e "albero"


21

Mi chiedo se possiamo combinare l'onestà di 'du' con la formattazione rientrata di 'tree'. Se voglio un elenco delle dimensioni delle directory:

du -hx -d2

... visualizza due livelli di profondità e tutti i riepiloghi delle dimensioni sono onesti, ma non è possibile rientrare nei rientri. D'altro canto:

tree --du -shaC -L 2

... rientra e colora bene, tuttavia le dimensioni riportate sono una bugia. Per ottenere le dimensioni reali è necessario:

tree --du -shaC

... vale a dire che ottieni le dimensioni reali solo se lasci che "albero" ti mostri l'intera struttura della directory. Mi piacerebbe essere in grado di avere sempre riepiloghi delle dimensioni corrette, indipendentemente da quanti livelli di sottodiretti voglio effettivamente visualizzare. Faccio spesso questo:

tree -du -shaC | grep "\[01;34m"

... che elimina tutto tranne le directory e le inserisce bene ... ma non esiste un modo semplice per limitare la visualizzazione a un determinato livello numerico (senza che i riepiloghi mentano). C'è un modo? Forse ho perso gli interruttori corretti ...

Risposte:


8

Controlla anche ncdu : http://dev.yorhel.nl/ncdu

La sua pagina elenca anche altri "progetti simili":

gt5 - Abbastanza simile a ncdu, ma con un approccio diverso.

tdu - Un'altra piccola utility di visualizzazione dell'utilizzo del disco basata su ncurses.

TreeSize - GTK, usando una vista ad albero.

Baobab - GTK, utilizzando grafici a torta, una vista ad albero e una vista ad albero. Viene fornito con GNOME.

GdMap - GTK, con display treemap.

Filelight - KDE, usando i grafici a torta.

KDirStat - KDE, con un display treemap.

QDiskUsage - Qt, usando i grafici a torta.

xdiskusage - FLTK, con un display treemap.

fsv - Visualizzazione 3D.

Philesight - Clone basato su Web di Filelight.


1
Grazie David, finalmente sono riuscito a guardarli. Ho scelto ncdu.
Ray Andrews,

@David da dove viene tdu?
shirish

@shirish Fare riferimento alla mia fonte, annotata sopra
David Potočnik

11

Non è necessario grep per il codice colore, l' -dopzione è list directories only.

Questo sembra fare quello che vuoi:

$ tree --du -d -shaC | grep -Ev '(  *[^ ]* ){2}\['
.
├── [  18]  dir1
├── [  30]  dir2
├── [ 205]  junk
│   ├── [  18]  dir1
│   ├── [  30]  dir2
│   └── [  76]  dir3
├── [ 119]  merge
└── [  20]  stuff

 4.4K used in 10 directories

Il grepcomando rimuove tutte le linee che hanno (uno o più spazi seguiti da un non-spazio seguito da uno spazio) due volte, seguito da un [.

Se si desidera una profondità di 1, modificare il conteggio associato all'interno delle parentesi graffe {} {1}anziché {2}. lo stesso se si desidera una profondità di 3, modificarlo in {3}.

Puoi trasformarlo in una funzione shell, in questo modo:

mytreedu() {
  local depth=''

  while getopts "L:" opt ; do
      case "$opt" in
          L) depth="$OPTARG" ;;
      esac
  done

  shift "$((OPTIND-1))"

  if [ -z "$depth" ] ; then
      tree --du -d -shaC "$@"
  else   
      local PATTERN='(  *[^ ]* ){'"$depth"'}\['
      tree --du -d -shaC "$@" | grep -Ev "$PATTERN"
  fi
}

Questo usa getoptsper "rubare" qualsiasi -Lopzione e il suo argomento dalla treeriga di comando, se ce n'è uno. Se non c'è -L nun'opzione sulla riga di comando, anche quello funziona.

Tutte le altre opzioni e arg sono passate al treecomando.

La local PATTERN=...linea non è davvero necessaria. L'ho fatto solo per assicurarmi che si adattasse a una riga e non a capo automatico qui U&L. L'espressione regolare potrebbe e probabilmente dovrebbe semplicemente andare direttamente sulla tree | grep ...linea.

Eseguilo in questo modo:

mytreedu 

o

mytreedu -L 2 /path/to/dir/

1
Adoro il codice, ma ripeto che non puoi usare '-d' perché se lo fai, i riepiloghi delle dimensioni non sono corretti, o almeno sono qui. La dimensione verrà sempre indicata come '4096' che è la dimensione della voce per la directory stessa, ma non la dimensione di tutto il suo contenuto.
Ray Andrews,

... avrebbe dovuto dire '4096' per ogni directory nella directory corrente ... ma non si ottengono le dimensioni della directory inclusi i suoi file.
Ray Andrews,

hai solo citato -Lcome un problema, non hai menzionato -daffatto. Ora che osservo più da vicino i numeri riportati, tree --duné le tree --du -ddimensioni del rapporto né in alcun modo assomigliano a quelle riportate da du.
Cas

Indica che qualcosa di meno di un display al 100% non ti darà dimensioni corrette. Puoi limitare tramite '-d' o '-L 2' o qualsiasi altra cosa: non viene mostrato, non viene conteggiato nella dimensione.
Ray Andrews,

tree --dunon sembra dare le dimensioni corrette per le directory comunque, con o senza -do -L. Non ho idea di quali dovrebbero essere i numeri, ma non sono collegati a ciò che duriporta.
Cas

3

Puoi usare dutree

inserisci qui la descrizione dell'immagine

  • output colorato, secondo la variabile d'ambiente LS_COLORS.
  • visualizza l'albero del file system
  • capacità di aggregare piccoli file
  • possibilità di escludere file o directory
  • capacità di confrontare diverse directory
  • veloce, scritto in Rust

1

Non esiste uno strumento di comando perfetto per farlo, ma ho trovato due modi che sono vicini.

  • mostra sia le dimensioni delle cartelle che dei file, ma non viene mostrato in modalità albero.

    du -ah --max-depth=1 /var/log

  • mostra in modalità albero ma solo le dimensioni dei file, le cartelle sono in conteggi

    tree -ah /var/log -L 1


0

Ispirato da cas, ora sto facendo questo:

treee ()
{
    integer levels=$(( ($1 + 1) * 4 ))
    tree --du -shaC | grep "\[01;34m" | grep -Ev "^[^\[]{$levels}\[*"
    du -sh .
}

se hai intenzione di buttare via tutta la roba getopts, dovresti almeno averlo "$@"subito dopo -shaC. in caso contrario, tale funzione è hardcoded per funzionare solo per la directory corrente.
Cas

Una volta che avessimo funzionato, ti avrei chiesto a riguardo: ti prego di elaborare. Proprio su "$ @" ovviamente, ma finora l'ho sempre usato solo nella directory corrente, quindi non l'ho ancora notato. Tutta questa roba 'getopts' è nuova per me, mi piacerebbe sapere cosa stai pensando lì.
Ray Andrews,

Uno dei vantaggi dell'utilizzo getoptsè che le opzioni possono apparire in qualsiasi ordine sulla riga di comando. La versione iniziale della mytreefunzione che ho scritto utilizzava "$ 1" proprio come la tua, quindi l'argomento approfondito doveva essere il primo argomento e non era facoltativo. Ho deciso che non era abbastanza buono, quindi ho usato il bash builtin getoptsper elaborare l' -Lopzione. Ciò ha permesso -L nall'opzione di apparire ovunque sulla riga di comando. Ha anche permesso che fosse completamente opzionale.
Cas

un altro modo di vederlo è che getoptsti permette di scrivere script che accettano opzioni e argomenti reali (piuttosto che solo argomenti in posizioni codificate come $ 1 $ 2 $ 3 ecc.), proprio come la maggior parte degli altri programmi sul tuo sistema. E se usi il getoptprogramma (nota che è senza s) dal util-linuxpacchetto puoi usare sia opzioni brevi a lettera singola (es. -l) Che opzioni lunghe (come --long) proprio come i programmi GNU.
Cas

Ah ... mi ritorna ora. Sì, l'ho usato una volta. Devo dare un'altra occhiata a questo. Grazie.
Ray Andrews,
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.