Verzeichnisgröße verkleinern / zurücksetzen?

11

Gibt es eine Möglichkeit, einen Verzeichniseintrag zu verkleinern?

Meine Dovecot-Maildir-Verzeichnisse haben sich von Standard 4096 auf mehrere Megabyte vergrößert, und es gibt Probleme mit Festplattenkontingenten.

Die einzige Möglichkeit, die ich gefunden habe, besteht darin, das Verzeichnis zu löschen und neu zu erstellen. Ich hoffe, dass es irgendwo eine magische Funktion gibt - ich bin offen für alles, außer für handcodierte Assembler.

Bearbeiten: Für die Nachwelt, um Dirents> 4096 zu finden:

 find / -type d -size +4k -printf "%s\t%p\t%i\n" | sort -nr
Mikewaters
quelle

Antworten:

6

Siehe auch rm in einem Verzeichnis mit Millionen von Dateien . tangential verwandt, aber wir diskutieren es dort.

Soweit mir bekannt ist, gibt es zumindest unter ext2 / 3 keine (Online-) Möglichkeit, sie vor dem Löschen + Neuerstellen zu verkleinern. Mehrere Quellen schlagen e2fsck -Dvor, dass sie nicht montiert sind , obwohl ich keine persönlichen Erfahrungen mit dieser Option behaupten kann.

Einige Referenzen zur weiteren Lektüre:

BMDan
quelle
1
Der erste Link war besonders hilfreich: Er hat mein Problem speziell angesprochen (Mailserver), und die Tatsache, dass Ted Tso den Dialog belastet hat, ist ziemlich cool;)
mikewaters
3

Ich musste kürzlich ein NFS-Verzeichnis löschen und neu erstellen, um seine Größe zu verringern, nachdem es zuvor aufgebläht war. Dabei habe ich einen ziemlich effizienten Weg gefunden, dies mit rsync und harten Links zu tun. Diese Methode vermeidet das Kopieren der eigentlichen Dateien und erreicht gleichzeitig das Ziel, das Verzeichnis mit demselben Inhalt neu zu erstellen.

Da wir während unseres Wartungsfensters Ausfallzeiten benötigen, um diesen Vorgang auszuführen, war es für uns wichtig, das neu erstellte Verzeichnis so schnell wie möglich verfügbar zu machen. Wenn Ihnen die Einfachheit wichtiger ist, ändern Sie den ersten Verschiebungsbefehl in einen 'rm -rf' im Quellverzeichnis und überspringen Sie den anderen 'rm -rf'-Befehl.

Ich habe diese Befehle aus einem größeren Prozess extrahiert und die Verzeichnisnamen abstrahiert. Ich entschuldige mich, wenn ich bei dieser Übersetzung einen Fehler gemacht habe.

mkdir /tmp/holding_dir/
rsync -ai --delete --link-dest=/path/to/source_dir/ /path/to/source_dir/ /tmp/holding_dir/
mv /path/to/source_dir/ /tmp/deleteme/
mv /tmp/holding_dir/ /path/to/source_dir/

Dann entfernen wir später das Verzeichnis. Je nach Größe müssen Sie möglicherweise eine ausgefeiltere Technik verwenden, um dies zu tun. Beispielsweise kann die Verwendung von rsync mit dem Flag --delete zum Synchronisieren eines leeren Verzeichnisses mit diesem Verzeichnis effizienter sein.

rm -rf /tmp/deleteme/
Dan McCarthy
quelle
2

Ich würde es so machen.

cp -aloldir newdir && mvolddir tempname && mvnewdir olddir && rm -rtempname

Dabei ist olddir das Verzeichnis, in dem Sie verkleinern möchten. newdir und tempname sind temporäre Dateinamen

cp -alErstellt Links zum Inhalt von olddir in newdir und die nächsten drei Befehle tauschen sie mit newdir aus und bereinigen.

user313114
quelle
glatt. Ich wusste nie über CP-L
Kevin Buchs