combiner le meilleur du «du» et de «l'arbre»

21

Je me demande si nous pouvons combiner l'honnêteté de «du» avec la mise en forme en retrait de «arbre». Si je veux une liste des tailles d'annuaires:

du -hx -d2

... affiche deux niveaux de profondeur et tous les résumés de taille sont honnêtes, mais il n'y a pas de retrait des sous-répertoires. D'autre part:

tree --du -shaC -L 2

... indentation et colorise bien mais les tailles rapportées sont un mensonge. Pour obtenir les vraies tailles, il faut:

tree --du -shaC

... c'est-à-dire que vous n'obtenez les vraies tailles que si vous laissez «arborescence» vous montrer la structure complète du répertoire. J'aimerais pouvoir toujours avoir des résumés de taille correcte quel que soit le nombre de niveaux de sous-répertoires que je souhaite réellement afficher. Je fais souvent ceci:

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

... qui supprime tout sauf les répertoires, et les met bien en retrait ... mais il n'y a pas de moyen facile de limiter l'affichage à un niveau de nombre donné (sans que les résumés ne mentent). Y a-t-il un moyen? J'ai peut-être manqué les bons commutateurs ...

Ray Andrews
la source

Réponses:

8

Consultez également ncdu : http://dev.yorhel.nl/ncdu

Sa page répertorie également d'autres "projets similaires":

gt5 - Assez similaire à ncdu, mais une approche différente.

tdu - Un autre petit utilitaire de visualisation de l'utilisation du disque basé sur ncurses.

TreeSize - GTK, en utilisant une arborescence.

Baobab - GTK, utilisant des camemberts, un treeview et un treemap. Livré avec GNOME.

GdMap - GTK, avec un affichage treemap.

Filelight - KDE, utilisant des camemberts.

KDirStat - KDE, avec un affichage treemap.

QDiskUsage - Qt, en utilisant des camemberts.

xdiskusage - FLTK, avec un affichage treemap.

fsv - Visualisation 3D.

Philesight - Clone Web de Filelight.

David Potočnik
la source
1
Merci David, j'ai enfin pu les regarder. J'ai choisi ncdu.
Ray Andrews
@David d'où vient tdu?
2017
@shirish Reportez-vous à ma source, notée ci
David Potočnik
11

Vous n'avez pas besoin de chercher le code couleur, l' -doption est list directories only.

Cela semble faire ce que vous voulez:

$ 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

La grepcommande supprime toutes les lignes qui ont (un ou plusieurs espaces suivis d'un non-espace suivi d'un espace) deux fois, suivi de a [.

Si vous voulez une profondeur de 1, remplacez le nombre de bornes à l'intérieur des accolades {} par {1}plutôt que {2}. même si vous voulez une profondeur de 3, changez-la en {3}.

Vous pouvez transformer cela en une fonction shell, comme ceci:

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
}

Cela permet getoptsde "voler" n'importe quelle -Loption et son argument depuis la treeligne de commande, s'il y en a une. S'il n'y a pas d' -L noption sur la ligne de commande, cela fonctionne aussi.

Toutes les autres options et arguments sont passés à la treecommande.

La local PATTERN=...ligne n'est pas vraiment nécessaire. Je l'ai seulement fait comme ça pour m'assurer qu'il tiendrait sur une seule ligne et non pas sur un mot U&L. L'expression régulière pourrait et devrait probablement aller directement sur la tree | grep ...ligne.

Exécutez-le comme ceci:

mytreedu 

ou

mytreedu -L 2 /path/to/dir/
cas
la source
1
J'adore le code, mais répétez que vous ne pouvez pas utiliser le '-d' car si vous le faites, les résumés de taille sont incorrects, ou du moins ils sont ici. La taille sera toujours signalée comme '4096' qui est la taille de l'entrée pour le répertoire lui-même, mais pas la taille de tout son contenu.
Ray Andrews du
... aurait dû dire '4096' pour chaque répertoire du répertoire courant ... mais vous n'obtenez pas la taille du répertoire, y compris ses fichiers.
Ray Andrews du
vous avez seulement mentionné -Lque c'était un problème, pas du tout mentionné -d. Maintenant que j'examine de plus près les chiffres rapportés, tree --duni tree --du -drapporter des tailles qui ressemblent en aucune façon à celles rapportées par du.
cas
Le point étant que rien de moins qu'un affichage à 100% ne vous donnera pas des tailles correctes. Vous pouvez limiter via '-d' ou '-L 2' ou quoi que ce soit d'autre - si ce n'est pas affiché, ce n'est pas compté dans la taille.
Ray Andrews,
tree --dune semble de toute façon pas donner les tailles correctes pour les répertoires, avec ou sans -dou -L. Je n'ai aucune idée de ce que les chiffres sont censés être, mais ils ne sont pas liés à quels durapports.
cas
3

Vous pouvez utiliser dutree

entrez la description de l'image ici

  • sortie colorée, selon la variable d'environnement LS_COLORS.
  • afficher l'arborescence du système de fichiers
  • pouvoir agréger de petits fichiers
  • pouvoir exclure des fichiers ou des répertoires
  • pouvoir comparer différents répertoires
  • rapide, écrit en rouille
nachoparker
la source
1

Il n'y a pas d'outil de commande parfait pour le faire, mais j'ai trouvé deux façons proches.

  • affiche la taille des dossiers et des fichiers, mais ne s'affiche pas en mode arborescence.

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

  • s'affiche en arborescence mais uniquement la taille des fichiers, les dossiers sont en nombre

    tree -ah /var/log -L 1

Vaillant Jiang
la source
0

Inspiré par cas, je fais maintenant ceci:

treee ()
{
    integer levels=$(( ($1 + 1) * 4 ))
    tree --du -shaC | grep "\[01;34m" | grep -Ev "^[^\[]{$levels}\[*"
    du -sh .
}
Ray Andrews
la source
si vous allez jeter tous les trucs getopts, vous devriez au moins toujours en avoir "$@"immédiatement après le -shaC. sinon, cette fonction est codée en dur pour fonctionner uniquement pour le répertoire en cours.
cas
Une fois que nous aurions réussi, j'allais vous poser des questions à ce sujet: veuillez élaborer. Bien sur "$ @" bien sûr, mais jusqu'à présent, je ne l'utilise que dans le répertoire actuel, donc je ne l'ai pas encore remarqué. Tous ces trucs «getopts» sont nouveaux pour moi, j'aimerais savoir ce que vous en pensez.
Ray Andrews
L'un des avantages de l'utilisation getoptsest que les options peuvent apparaître dans n'importe quel ordre sur la ligne de commande. La version initiale de la mytreefonction que j'ai écrite utilisait "$ 1" comme la vôtre, donc l'argument depth devait être le premier argument, et ce n'était pas optionnel. J'ai décidé que ce n'était pas assez bon, j'ai donc utilisé le bash-builtin getoptspour traiter l' -Loption. Cela a permis à l' -L noption d'apparaître n'importe où sur la ligne de commande. Cela lui a également permis d'être complètement facultatif.
cas
une autre façon de voir les choses est de getoptsvous permettre d'écrire des scripts qui prennent de vraies options et arguments (plutôt que de simples arguments dans des positions codées en dur comme $ 1 $ 2 $ 3, etc.), tout comme la plupart des autres programmes de votre système. Et si vous utilisez le getoptprogramme (notez qu'il n'y a pas de s) du util-linuxpaquet, vous pouvez utiliser à la fois des options courtes à une seule lettre (par exemple -l) et des options longues (comme --long), tout comme les programmes GNU.
cas
Ah ... ça me revient maintenant. Oui, je l'ai utilisé une fois. Doit y jeter un autre regard. Merci.
Ray Andrews