kombiniere das Beste aus "du" und "tree"

21

Ich frage mich, ob wir die Ehrlichkeit von "du" mit der eingerückten Formatierung von "tree" kombinieren können. Wenn ich eine Liste der Größe von Verzeichnissen haben möchte:

du -hx -d2

... zeigt zwei Ebenen tief und alle Größenzusammenfassungen sind ehrlich, aber es gibt keine Einrückungen von Unterverzeichnissen. Auf der anderen Seite:

tree --du -shaC -L 2

... gut eingerückt und eingefärbt, aber die angegebenen Größen sind eine Lüge. Um die tatsächlichen Größen zu erhalten, muss man:

tree --du -shaC

... das heißt, Sie erhalten nur dann die wahren Größen, wenn Sie sich die gesamte Verzeichnisstruktur von 'tree' anzeigen lassen. Ich möchte immer Zusammenfassungen der richtigen Größe haben, unabhängig davon, wie viele Ebenen von Unterverzeichnissen ich tatsächlich anzeigen möchte. Ich mache das oft:

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

... was alles außer Verzeichnissen herausschneidet und sie gut einrückt ... aber es gibt keine einfache Möglichkeit, die Anzeige auf eine bestimmte Anzahl von Ebenen zu beschränken (ohne dass die Zusammenfassungen lügen). Gibt es einen Weg? Vielleicht habe ich die richtigen Schalter verpasst ...

Ray Andrews
quelle

Antworten:

8

Siehe auch ncdu : http://dev.yorhel.nl/ncdu

Seine Seite listet auch andere "ähnliche Projekte" auf:

gt5 - Ganz ähnlich wie ncdu, aber ein anderer Ansatz.

tdu - Ein weiteres kleines ncurses-basiertes Dienstprogramm zur Visualisierung der Festplattennutzung.

TreeSize - GTK unter Verwendung einer Baumansicht.

Baobab - GTK, mit Tortendiagrammen, einer Baumansicht und einer Baumkarte. Kommt mit GNOME.

GdMap - GTK mit einer Baumkarte.

Filelight - KDE mit Kreisdiagrammen.

KDirStat - KDE mit einer Baumkarte.

QDiskUsage - Qt unter Verwendung von Kreisdiagrammen.

xdiskusage - FLTK mit einer Treemap-Anzeige.

fsv - 3D Visualisierung.

Philesight - Webbasierter Klon von Filelight.

David Potočnik
quelle
1
Danke, David, endlich bin ich dazu gekommen, mir diese anzuschauen. Ich habe ncdu ausgewählt.
Ray Andrews
@ David, woher kommt tdu?
Shirish
@ shirish Beziehen Sie sich auf meine oben genannte Quelle
David Potočnik
11

Sie müssen nicht nach dem Farbcode suchen, die -dOption ist list directories only.

Dies scheint zu tun, was Sie wollen:

$ 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

Mit dem grepBefehl werden alle Zeilen mit (einem oder mehreren Leerzeichen, gefolgt von einem Nicht-Leerzeichen, gefolgt von einem Leerzeichen) zweimal entfernt, gefolgt von einem [.

Wenn Sie eine Tiefe von 1 wünschen, ändern Sie die Anzahl der Bindungen in den geschweiften Klammern von {} in {1}anstatt {2}. Das Gleiche gilt, wenn Sie eine Tiefe von 3 wünschen. Ändern Sie sie in {3}.

Sie können dies wie folgt in eine Shell-Funktion umwandeln:

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
}

Dies wird verwendet getopts, um eine -LOption und ihr Argument von der treeBefehlszeile zu "stehlen" , falls es eine gibt. Wenn es keine gibt-L n in der Befehlszeile Option angezeigt wird, funktioniert dies auch.

Alle anderen Optionen und Argumente werden an den treeBefehl übergeben.

Die local PATTERN=...Leitung ist nicht wirklich notwendig. Ich habe es nur so gemacht, um sicherzustellen, dass es in eine Zeile passt und hier nicht in Zeilenumbrüche U&L. Der reguläre Ausdruck könnte und sollte wahrscheinlich direkt in die tree | grep ...Zeile eingefügt werden.

Führen Sie es so aus:

mytreedu 

oder

mytreedu -L 2 /path/to/dir/
cas
quelle
1
Ich liebe den Code, aber wiederholen Sie, dass Sie das '-d' nicht verwenden können, da sonst die Größenzusammenfassungen falsch sind oder zumindest hier stehen. Die Größe wird immer als '4096' angegeben. Dies ist die Größe des Eintrags für das Verzeichnis selbst, jedoch nicht die Größe des gesamten Inhalts.
Ray Andrews
... hätte für jedes Verzeichnis unter dem aktuellen Verzeichnis '4096' sagen sollen ... aber Sie erhalten nicht die Größe des Verzeichnisses einschließlich der darin enthaltenen Dateien.
Ray Andrews
Sie haben nur -Lals Problem erwähnt, aber überhaupt nicht erwähnt -d. Jetzt, wo ich mir die gemeldeten Zahlen genauer ansehe, tree --dunoch tree --du -dGrößen, die in irgendeiner Weise denen ähneln, die von gemeldet wurden du.
cas
Wenn Sie weniger als 100% anzeigen, erhalten Sie keine korrekten Größen. Sie können einschränken mit '-d' oder '-L 2' oder was auch immer - es wird nicht angezeigt, es wird nicht in der Größe mitgezählt.
Ray Andrews
tree --duScheint ohnehin nicht die richtigen Größen für Verzeichnisse anzugeben, mit oder ohne -doder -L. Ich habe keine Ahnung, wie die Zahlen lauten sollen, aber sie haben nichts mit welchen duBerichten zu tun .
cas
3

Sie können dutree verwenden

Bildbeschreibung hier eingeben

  • Farbausgabe entsprechend der Umgebungsvariablen LS_COLORS.
  • Den Dateisystembaum anzeigen
  • Fähigkeit, kleine Dateien zu aggregieren
  • Möglichkeit zum Ausschließen von Dateien oder Verzeichnissen
  • Fähigkeit, verschiedene Verzeichnisse zu vergleichen
  • schnell, geschrieben in Rust
nachoparker
quelle
1

Es gibt kein perfektes Befehls-Tool, um dies zu tun, aber ich habe zwei Möglichkeiten gefunden, die eng beieinander liegen.

  • Zeigt die Größe von Ordnern und Dateien an, jedoch nicht in einem Baummodus.

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

  • Zeigt im Baummodus aber nur die Dateigröße an, die Ordner werden gezählt

    tree -ah /var/log -L 1

Valiant Jiang
quelle
0

Inspiriert von cas mache ich jetzt Folgendes:

treee ()
{
    integer levels=$(( ($1 + 1) * 4 ))
    tree --du -shaC | grep "\[01;34m" | grep -Ev "^[^\[]{$levels}\[*"
    du -sh .
}
Ray Andrews
quelle
wenn du das ganze getopts zeug wegwerfen willst, solltest du wenigstens noch "$@"gleich nach dem haben -shaC. Andernfalls ist diese Funktion fest programmiert und funktioniert nur für das aktuelle Verzeichnis.
cas
Sobald wir das Ding zum Laufen gebracht haben, wollte ich Sie danach fragen: Bitte erläutern Sie. Richtig zu "$ @" natürlich, aber bisher verwende ich es immer nur in der aktuellen Richtung, also habe ich das noch nicht bemerkt. Das ganze Getopts-Zeug ist neu für mich. Ich würde gerne wissen, was du da denkst.
Ray Andrews
Einer der Vorteile der Verwendung getoptsist, dass die Optionen in der Befehlszeile in beliebiger Reihenfolge angezeigt werden können. Die erste Version der mytreeFunktion habe ich „$ 1“ verwendet , so wie Ihr tat, so die Tiefe Argument sein , hatte das erste Argument, und es war nicht optional. Ich entschied, dass das nicht gut genug war, also benutzte ich die eingebaute Bash getopts, um die -LOption zu verarbeiten . Dadurch konnte die -L nOption an einer beliebigen Stelle in der Befehlszeile angezeigt werden. Es erlaubte auch, dass es völlig optional war.
cas
Eine andere Betrachtungsweise ist, getoptsdass Sie Skripte schreiben können, die echte Optionen und Argumente enthalten (anstatt nur Argumente in fest codierten Positionen wie $ 1 $ 2 $ 3 usw.), genau wie die meisten anderen Programme auf Ihrem System. Und wenn Sie das getoptProgramm saus dem util-linuxPaket verwenden (beachten Sie, dass es ohne ein ) , können Sie sowohl kurze Optionen mit einem Buchstaben (z. B. -l) als auch lange Optionen (wie z. B. ) --longwie GNU-Programme verwenden.
cas
Ah ... es kommt jetzt zu mir zurück. Ja, das habe ich tatsächlich einmal benutzt. Ich muss es mir noch einmal ansehen. Vielen Dank.
Ray Andrews