Ich weiß, dass wenn ich einen leeren Katalog erstelle, dieser seine eigene Größe hat:
mkdir test && du -h test
gibt:
4,0K test
Aber dieser Fall ist anders. Ich hatte einen Katalog mit 1e6 Dateien (74 GB) auf einer externen Festplatte (ext4). Ich habe diese Dateien verarbeitet, in einem anderen Katalog gespeichert und von diesem Speicherort in einem parallelisierten Skript gelöscht. Jetzt sollte dieser Katalog leer sein. Es ist also ok, dass
ls -a raw/all
. ..
Aber
du -h raw/all
gibt
19M raw/all
Ohne -h
haben wir genau 19288B. Und das ist auch ein seltsames Ergebnis:
ls -la raw/all
total 19292
drwxr-xr-x 2 daniel daniel 19746816 wrz 18 19:23 .
drwxrwxr-x 4 daniel daniel 4096 wrz 17 13:21 ..
Was ist los? Gibt es im du
Befehl einen Cache? Oder gibt es nach der Verarbeitung so vieler Dateien noch Reste nach diesen Dateien? Ich habe die Dateien unlink
im Perl5-Skript gelöscht.
Update - Antworten auf Fragen aus Kommentaren
ls -aiR raw/all
raw/all:
51647758 . 51647760 ..
lsof +L1
druckt 44 Zeilen, aber nichts, was mit diesem Katalog zusammenhängt. lsof
Gibt aber etwas mit Zahlen wie aus 19746816
.
lsof | grep raw
bash 5355 daniel cwd DIR 8,17 19746816 51647758 /media/daniel/f2971ccd-4841-4da3-8ce3-d9f2cc03fc27/daniel/pro/scraper/raw/all
lsof 5677 daniel cwd DIR 8,17 19746816 51647758 /media/daniel/f2971ccd-4841-4da3-8ce3-d9f2cc03fc27/daniel/pro/scraper/raw/all
grep 5678 daniel cwd DIR 8,17 19746816 51647758 /media/daniel/f2971ccd-4841-4da3-8ce3-d9f2cc03fc27/daniel/pro/scraper/raw/all
lsof 5679 daniel cwd DIR 8,17 19746816 51647758 /media/daniel/f2971ccd-4841-4da3-8ce3-d9f2cc03fc27/daniel/pro/scraper/raw/all
Laptop wurde neugestartet. Externes Laufwerk wurde getrennt. du
Zeigt aber immer noch an 19M
.
Antwort1
Verzeichnisse in ext4-Dateisystemen wachsen, werden aber nicht kleiner. Wenn also irgendwann 19 MB für die Speicherung von Dateidetails benötigt wurden, bleibt dieser Speicherplatz erhalten, selbst wenn diese Dateien gelöscht werden. Wenn Sie ein jetzt leeres Verzeichnis verkleinern möchten, löschen Sie es und erstellen Sie es neu:
rmdir foo && mkdir foo
Oder Beibehaltung der Berechtigungen:
mkdir foo2
chown --reference=foo foo2
getfacl foo | setfacl --set-file=- foo2
rmdir foo
mv foo2 foo
Quelle: