Ein Windows-Anwender konfrontierte mich (Linux-Anwender) heute mit
einer Frage, bei der ich passen musste.
Die Aufgabenstellung lautet:
Unter Windows mit dem richtigen Werkzeug (sagen wir mal Total Commander) istErmittle mit einem Standardwerkzeug die tatsächliche Größe aller Dateien
in einer geschachtelten Verzeichnishierarchie, ohne erst ewig lang programmieren
zu müssen..
das kein Problem. Zuerst dachte ich, er will mich auf den Arm nehmen, aber nach
mehreren Minuten Recherche, Man-Page-Lesen und Ausprobieren, stellten wir fest,
dass diese einfache Aufgabe mit Linux eine riesige Herausforderung ist.
Versuchsaufbau
Ich bastle mir ein paar Dateien, lege ein paar Verzeichnisse an und
kopiere / schiebe die Dateien da hin:
Code: Alles auswählen
#!/bin/bash
>24_byte.txt
echo -e -n "abcdefghijklmnopqrstuvw\n">>24_byte.txt
>100_byte.txt
for loop in `seq 1 9`; do echo -e -n "1234567890">>100_byte.txt; done
echo -e -n "123456789\n">>100_byte.txt
>1000_byte.txt
for loop in `seq 1 10`; do cat 100_byte.txt>>1000_byte.txt; done
>1024_byte.txt
for loop in `seq 1 10`; do cat 100_byte.txt>>1024_byte.txt; done
cat 24_byte.txt>>1024_byte.txt
>7000_byte.txt
for loop in `seq 1 7`; do cat 1000_byte.txt>>7000_byte.txt; done
>1_MiB.txt
for loop in `seq 1 1024`; do cat 1024_byte.txt>>1_MiB.txt; done
>1_GiB.txt
for loop in `seq 1 1024`; do cat 1_MiB.txt>>1_GiB.txt; done
>2_GiB.txt
for loop in `seq 1 2`; do cat 1_GiB.txt>>2_GiB.txt; done
mkdir 28000_byte
mkdir 28000_byte/7000_byte
mkdir 28000_byte/14000_byte
mkdir 28000_byte/14000_byte/7000_byte
mkdir 3_GiB
cp -a 7000_byte.txt 28000_byte
cp -a 7000_byte.txt 28000_byte/7000_byte
cp -a 7000_byte.txt 28000_byte/14000_byte
cp -a 7000_byte.txt 28000_byte/14000_byte/7000_byte
mv 1_GiB.txt 3_GiB
mv 2_GiB.txt 3_GiB
Das Resultat sind diese sich selbst erklärenden zwei Verzeichnishierarchien
namens '28000_byte' und '3_GiB':
Code: Alles auswählen
28000_byte
|
+- 14000_byte
| |
| +- 7000_byte
| | |
| | +- 7000_byte.txt
| |
| +- 7000_byte.txt
|
+- 7000_byte
| |
| +- 7000_byte.txt
|
+- 7000_byte.txt
3_GiB
|
+- 1_GiB.txt
|
+- 2_GiB.txt
Und nun die Experimente
Die Herausforderung besteht darin, einen allgemeingültigen Weg zu finden,
wie man die Größen der zwei Verzeichnisse '28000_byte' und '3_GiB' messen kann.
Versuch 1: Midnight Commander
Ich drücke <Ctrl>+<Leertaste>, um das Kommando 'show directory sIzes' aufzurufen.
Dann kann ich jeweils mit der <Einfügen>-Taste ein Verzeichnis markieren,
und unten sehe ich dann jeweils:
- 28,000 bytes in 1 file
- 3,145,728K bytes in 1 file
erste Ergebnis zeigt mir korrekt 28000 Byte an. Das andere Ergebnis lautet
3145728 Kibibyte. Das entspricht aber nicht der Aufgabenstellung, denn erstens
ist die Angabe in Kibibyte zu ungenau, weil die letzten 3 Ziffern fehlen und
zweitens wollten wir eben Byte haben und eben nicht Kibibyte, und auch nicht
Kilobyte.
Versuch 2: du
Es war naheliegend, es mit 'du' zu versuchen, doch, was 'du' als Ergebnis
abliefert, das ist einfach nur der Hammer. Egal, welche Argumente man ihm
verfüttert, die Ergebnisse sind falsch, falsch und wieder falsch.
Das Tool 'du' misst unter anderem die Größe, die ein Verzeichnis verbraucht,
und es misst, wie viel Platz die Dateien auf der Platte brauchen, aber nicht,
wie groß sie tatsächlich sind. Dann gibt es da noch dieses
komische '--apparent-size', aber auch das liefert nicht das gewünschte Ergebnis.
Versuch 3: ncdu
Ein Google-Treffer lieferte den Hinweis, es mal mit ncdu zu versuchen.
Hab ich gemacht. Hier sind die Ergebnisse:
Code: Alles auswählen
+---Item info----------------------------------------------+
| |
| Name: 3_GiB |
| Path: /multi/sandbox |
| Type: Directory |
| |
| Disk usage: 3.0GiB (3.224.383.488 B) |
| Apparent size: 3.0GiB (3.221.229.568 B) |
| |
| Press i to hide this window|
+----------------------------------------------------------+
[code]
| |
| Name: 28000_byte |
| Path: /multi/sandbox |
| Type: Directory |
| |
| Disk usage: 48.0kiB (49.152 B) |
| Apparent size: 43.3kiB (44.384 B) |
| |
| Press i to hide this window|
+----------------------------------------------------------+
[/code]
Wir sehen hier zwar, dass sich 'ncdu' um eine Angabe in Byte bemüht,
auch bei dem Verzeichnis mit dem Namen '/multi/sandbox/3_GiB', aber
insgesamt sind die Ergebnisse, die 'ncdu' meldet, leider wieder
falsch:
- Weder 3.224.383.488 B, noch 3.221.229.568 B, sondern 3.221.225.472 B wären korrekt gewesen.
- Weder 49.152 B, noch 44.384 B, sondern 28.000 B wären korrekt gewesen.
Die Frage lautet also:
Wie bekomme ich unter Linux mit einem Standardwerkzeug heraus,
ohne lange programmieren zu müssen, dass das Verzeichnis '3_GiB'
3221225472 Byte und das Verzeichnis '28000_byte' 28000 Byte groß ist?
Besten Dank im Voraus,
dolphin