• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

(Gelöst) Verzeichnisgröße mit du: wie sortieren mit MB/GB

ojkastl

Hacker
Hallo,

scheiss Betreff ich weiss.
Man kann sich ja per "du | sort -rn | less" die Größe der Verzeichnisse anzeigen lassen. Das ist auch schön und gut. Es ginge auch per "du -h |sort | less", da hat man dann "lesbare" Größenangaben. Nur kann man die schlecht sortieren, da 4MB und 4GB gleich einsortiert werden.

Wie schafft man es das trotzdem zu sortieren? Gibt es einen Befehl, mit dem sort erkennt, dass es gerade MB-Angaben sortiert?

Danke.

P.S. Hab die Suche ausprobiert, aber nach du suchen ist etwas witzlos. Sonst nix gefunden.
 

regexer

Advanced Hacker
Wie schafft man es das trotzdem zu sortieren? Gibt es einen Befehl, mit dem sort erkennt, dass es gerade MB-Angaben sortiert?

Ich weiß leider nicht, ob man den sortieralgorithmus bei sort verändern kann. In der Scriptsprache perl geht das. Da sähe eine Lösung wiefolgt aus:
Code:
#!/usr/bin/perl

use strict;

open (DU, "du -h |") || die "Fehler bei du -h: $!\n";
for (sort human (<DU>)) {
  print;
}
close DU;

sub human {
  my ($A, $B);
  $A=&transform ((split /\t/, $a)[0]);
  $B=&transform ((split /\t/, $b)[0]);
  $A <=> $B;
}

sub transform {
  $_[0]*=1024           if ($_[0]=~/K/);
  $_[0]*=1024*1024      if ($_[0]=~/M/);
  $_[0]*=1024*1024*1024 if ($_[0]=~/G/);
  return $_[0];
}

Einfach dieses Script zum Beispiel unter du-sorted.pl speichern und mit "du-sorted.pl | less" aufrufen...
 

TeXpert

Guru
man kann sort parametrisieren (man sort hilft weiter) allerdings leider nicht in der gewünschten Funktion. Du kannst mit sort -n bzw. sort -g die Einheiten ignorieren damit wird dann allerdings 1.2M kleiner als 4k :(

evtl. reicht aber schon durep als Werkzeug aus.
 

regexer

Advanced Hacker
TeXpert schrieb:
Du kannst mit sort -n bzw. sort -g die Einheiten ignorieren damit wird dann allerdings 1.2M kleiner als 4k :(
sort -g wäre wahrscheinlich besser, da dieser mit Decimalzahlen umgehen kann. Mir scheint, als könnte ein Wert, der in K angegeben ist, nie größer als ein M-Wert sein. Deswegen könnte man zuerst alle Zeilen mit K sortieren und ausgeben, dann alle Zeilen mit M, usw.. "Elegant" ist diese Lösung nicht, würde aber ganz ohne perl funktionieren.
Code:
du -h | grep 'K	' | sort -g
du -h | grep 'M	' | sort -g
du -h | grep 'G	' | sort -g
Nach dem Großbuchstaben im grep sollte übrigens ein TAB stehen ...
 
OP
O

ojkastl

Hacker
TeXpert schrieb:
man kann sort parametrisieren (man sort hilft weiter) allerdings leider nicht in der gewünschten Funktion. Du kannst mit sort -n bzw. sort -g die Einheiten ignorieren damit wird dann allerdings 1.2M kleiner als 4k :(
Ja, das hab ich herausgefunden.


evtl. reicht aber schon durep als Werkzeug aus
Kannst du das mal präzisieren? Ich hab dazu nix gefunden.
snaewe schrieb:
Willst du unbedingt die 'GB' oder 'MB' Angaben sehen ?
Ansonsten: 'du -sk'
Das bringt gar nix, da krieg ich nur ein Ergebnis, und nicht eine Liste der Verzeichnise.

@notoxp:
Die letzte Möglichkeit mit "du -h|grep 'K '|sort -g" bringt fast nix, da hab ich ja alles einzeln. Ausserdem darf da kein Tab stehen, bei mir gehts nur mit K' ohne was dazwischen.

Werd jetzt mal das perl-Skript probieren.

Danke euch allen schon mal.
 
OP
O

ojkastl

Hacker
So jetzt hab ich das perl-Skript mal angeschaut. Das funktioniert.

Wenn man

Code:
open (DU, "du -h |") || die "Fehler bei du -h: $!\n";

gegen

Code:
open (DU, "du -h --max-depth=1 |") || die "Fehler bei du -h: $!\n";

ersetzt, liefert es nur noch die Verzeichnisse direkt, keine Unterverzeichnisse, und schön nach Größe sortiert.
 
OP
O

ojkastl

Hacker
@snaewe:

Es ging mir ja gerade darum, dass ich sortieren kann, und trotzdem einfach zu lesende MB/GB-Angaben hab. Hab ich ja jetzt mit dem Perl-Skript.
Danke dir trotzdem.
 

oc2pus

Ultimate Guru
bei google der erste Treffer ;)

durep creates disk usage reports with bar graphs, allowing one to easily deduce which directories are using the most space. Although durep can produce text output similar to du, its real power lies in the ability to store reports in a file, which can then be viewed as a web page with the supplied cgi script.

An example web report can be seen here (PNG image). Example text output is here.

http://www.hibernaculum.net/durep/index.php
 
OP
O

ojkastl

Hacker
Da war ich wohl zu schnell. Ich hab alles bei Suse durchsucht, und mit apt, und nix gefunden. Auf Google bin ich gar nicht gekommen. Schande über mich. Danke euch fürs Suchen.
 

regexer

Advanced Hacker
Saber_Rider schrieb:
@notoxp:
Die letzte Möglichkeit mit "du -h|grep 'K '|sort -g" bringt fast nix, da hab ich ja alles einzeln. Ausserdem darf da kein Tab stehen, bei mir gehts nur mit K' ohne was dazwischen.
Naja, aber wenn du ein Shellscript mit den drei Befehle hintereinander schreibst müsste es doch auch gehen. Hinter das "K" muss aber ein Tabulator, da er ja sonst auch Verzeichnisnamen mit einem großen "K" grept. Und nach dem "K" von Kilobyte wird zumindest bei mir ein Tabulator und erst dann der Verzeichnisname ausgegeben.

Wie auch immer... Ich finde das perl-Script auch schöner :D
 

regexer

Advanced Hacker
TeXpert schrieb:
zur Sicherheit sollte man besser mit entsprechenden zeichenklassen greppen :) also "du -h|grep 'K[[:space:]]'" dann klappts auch mit Space, tab und Co..
Hmmmm. Ein space nach einem K im Verzeichnisnamen ist viel wahrscheinlicher (vor allem in der Windows-Welt) als ein tab nach einem K.
Auf die Frage, wie man ein Tabulatorzeichen für grep maskiert bin ich überfragt...
 

TeXpert

Guru
notoxp schrieb:
TeXpert schrieb:
zur Sicherheit sollte man besser mit entsprechenden zeichenklassen greppen :) also "du -h|grep 'K[[:space:]]'" dann klappts auch mit Space, tab und Co..
Hmmmm. Ein space nach einem K im Verzeichnisnamen ist viel wahrscheinlicher (vor allem in der Windows-Welt) als ein tab nach einem K.
Auf die Frage, wie man ein Tabulatorzeichen für grep maskiert bin ich überfragt...

hmm stimmt... also besser so: du -h | grep 'K[[:space:]]*./' damit schlagen wir alle Klappen tot ;) der grep-Ausdruck greift nur im 1. Teil vor dem Pfad der auf jeden Fall am Anfang ein / hat.

Variante 1: im aktuellen Verzeichnis: (du -h)
19K ./foobar
hier matcht der '.' auf den '.'

Variante 2: in anderem Verzeichnis: (du -h /bar)
19K /bar/foobar
hier matcht der '.' auf das letzte Whitespacezeichen vor dem '/'
 
OP
O

ojkastl

Hacker
Ich möchte eure Diskussion nicht unterbrechen, hab aber jetzt mal das Subject um "Gelöst" erweitert. ;-)
 
Oben