Gibt es eine einfache Möglichkeit, alle Dateien mit geringer Dichte auf meinem System oder in einem bestimmten Verzeichnisbaum zu finden?
Wenn es relevant ist, verwende ich zsh
Ubuntu 12.04, obwohl eine allgemeinere Unix-y-Antwort zum Beispiel für bash / sh in Ordnung wäre.
Bearbeiten : Um dies zu verdeutlichen, suche ich nach Dateien mit geringer Dichte und überprüfe nicht den Status einer einzelnen Datei.
filesystems
files
Andrew Ferrier
quelle
quelle
Antworten:
Auf Systemen (und Dateisystemen), die das
SEEK_HOLE
lseek
Flag unterstützen (wie bei Ubuntu 12.04 unter ext4) und den WertSEEK_HOLE
4 annehmen, wie dies unter Linux der Fall ist:Diese Shell-Syntax lautet POSIX. Die nicht tragbaren Dinge darin sind
perl
und dasSEEK_HOLE
.lseek(SEEK_HOLE)
Sucht nach dem Anfang des ersten Lochs in der Datei oder nach dem Ende der Datei, wenn kein Loch gefunden wird. Oben wissen wir, dass die Datei nicht spärlich ist, wenn sielseek(SEEK_HOLE)
uns zum Ende der Datei führt (an die gleiche Stelle wielseek(SEEK_END)
).Wenn Sie die Sparse-Dateien auflisten möchten:
Die GNU
find
(seit Version 4.3.3) muss-printf %S
die Kargheit einer Datei melden . Dies entspricht dem Ansatz von frostschutz, bei dem das Verhältnis von Datenträgernutzung zu Dateigröße berücksichtigt wird. Es kann daher nicht garantiert werden, dass alle Dateien mit geringer Speicherkapazität gemeldet werden (z. B. wenn die Komprimierung auf Dateisystemebene erfolgt oder der durch die Lücken gespeicherte Speicherplatz nicht Kompensieren Sie den Overhead der Dateisysteminfrastruktur (oder große erweiterte Attribute), funktionieren Sie jedoch auf Systemen ohneSEEK_HOLE
oder auf Dateisystemen, auf denen diesSEEK_HOLE
nicht implementiert ist. Hier mit GNU-Tools:(Beachten Sie, dass eine frühere Version dieser Antwort nicht richtig funktionierte, wenn
find
die Kargheit ausgedrückt wurde, wie zum Beispiel 3.2e-05. Vielen Dank an @ flashydaves Antwort , dass Sie mich darauf aufmerksam gemacht haben.)quelle
find
sollte man auch 0-Byte-Dateien komplett ausschließen?find -printf '%S'
! :-)tr
Befehl durchxargs -r0 rm -f
Eine Datei ist normalerweise sparsam, wenn die Anzahl der zugewiesenen Blöcke kleiner als die Dateigröße ist (hier unter Verwendung von GNU,
stat
wie es unter Ubuntu zu finden ist, aber beachten Sie, dass andere Systeme möglicherweise nicht kompatible Implementierungen von habenstat
).Variante mit
find
: (von Stephane gestohlen)Sie würden dies normalerweise in ein Shell-Skript schreiben und dann das Shell-Skript ausführen.
quelle
SEEK_HOLE
ist jedoch genauso problematisch, da es von vielen Plattformen / Dateisystemen nicht unterstützt wird. In Linux könnte man auchFIEMAP
/ verwendenFIBMAP
, aberFIBMAP
insbesondere ist es furchtbar langsam ... es scheint einfach keinen guten Weg zu geben.for file in *
oder zu packenfind
. Wenn Sie eine einzelne Datei testen können, können Sie alle Dateien testen, obwohl Sie mit dieser Methode Verzeichnisse ausschließen müssen.Die obige Antwort von Stephane Chazelas berücksichtigt nicht die Tatsache, dass einige spärliche Dateien mit dem Parameter find% S das Verhältnis als Gleitkommazahlen wie angeben
Diese finden Sie zusätzlich bei
quelle
Ein kurzes Skript, das ich geschrieben habe, als ich versucht habe, die Position der Löcher in einer Datei herauszufinden:
Dies druckt Sachen wie:
quelle