ubuntuusers.de

Größe aller Unterverzeichnisse

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

kobe

Anmeldungsdatum:
18. November 2008

Beiträge: 170

Hallo

Ich möchte sortiert und lesbar aufgelistet bekommen, wie groß alle enthaltenen Unterverzeichnisse sind.

Lesbar aufgelistet bekomme ich es hin

1
du . --max-depth=1 -h

Aber ich möchte die Ausgabe der Größe nach sortiert haben.

1
du . --max-depth=1 | sort -n

Wie bekomme ich die erste Ausgabe sortiert oder die zweite human readable? Und wie kann ich das aktuelle Verzeichnis aus der Sortierung herausnehmen? Dass das aktuelle Verzeichnis das größte ist, ist mir klar.

Gruß Kobe

deprecated

Avatar von deprecated

Anmeldungsdatum:
21. Dezember 2009

Beiträge: 91

Wohnort: Wien

Geht meines Wissens nicht anders, als die zweite Variante irgendwie selbst "human readable" zu machen. (Andersrum wäre es jedenfalls um einiges komplizierter, falls es überhaupt möglich ist.)

Also muss man Zeile für Zeile jeweils den ersten Wert solange durch 1024 teilen, bis man beim richtigen Vorzeichen ist.

Ein Problem: Bash kann nicht mit Fließkomma-Zahlen umgehen, also muss man sich z.B. bc zu Hilfe nehmen, wenn man nicht auf Informationen verzichten möchte.

Zu deiner zweiten Frage: bis auf das aktuelle Verzeichnis haben alle ein / im Dateinamen, also kann man es ganz einfach mit grep rausfiltern.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash
du $1 $2 | grep / | sort -n | while read groesse name
do
  for e in K M G T
  do
    k=$(echo "$groesse<1024" | bc)
    if [ $k -eq 1 ]
    then
      printf "$groesse$e\t$name\n"
      break
    fi
    groesse=$(echo "scale=1; $groesse/1024" | bc)
  done
done

kobe

(Themenstarter)

Anmeldungsdatum:
18. November 2008

Beiträge: 170

Dankeschön. Auch wenn ich (noch) nicht alles verstehe, habe ich es ein wenig komfortabler gemacht

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

if [ ! $# -eq 1 ]
then
    dir=$(pwd)
else
    dir=$(cd $1; pwd)
fi

echo "Betrachte Verzeichnis $dir"
du $dir --max-depth=1 | grep / | sort -n | while read groesse name
do
  for e in K M G T
  do
    k=$(echo "$groesse<1024" | bc)
    if [ $k -eq 1 ]
    then
      printf "$groesse$e\t$name\n"
      break
    fi
    groesse=$(echo "scale=1; $groesse/1024" | bc)
  done
done
Antworten |