Datei mit Sonderzeichen löschen

Bei Datenaustausch kann es mal vorkommen, dass Dateien mit nicht darstellbaren Sonderzeichen auf dem Rechner landen. Diese Dateien lassen sich uU auch in einem Terminal nicht mehr so ohne Weiteres löschen. Aber es besteht noch die Möglichkeit die Datei über seine Inode1) direkt im Dateisystem zu löschen.

Das ls-Kommando zeigt die vermeindlich »kaputte« Datei ??erma?[3~ an:

$ ls -la
total 0
-rw-r--r--  1 pronto  wheel  876 23 Mai 14:33 ??erma?[3~
drwxrwxrwt  7 root    wheel  238 23 Mai 14:35 .
drwxr-xr-x@ 6 root    wheel  204 14 Aug  2009 ..
-rw-r--r--  1 pronto  wheel  987 23 Mai 14:52 obermann

Wenn alle Löschversuche scheitern oder ein Löschen der Datei mit Wildcards nicht in Frage kommt, weil andere Dateien uU davon betroffen wären, wie in diesem Beispiel, kann man sich mit dem stat-Kommando2) die Inodes der Dateien anzeigen lassen. Der Parameter %d zeigt dabei die Inode des Volumes an respektive des Verzeichnisses, welches das Volume repräsentiert; der Parameter %i die Inode der Datei. Die Dateien werden ihrer Reihenfolge nach im Dateisystem angezeigt:

$ stat -f "%d %i" *erma*
234881025 2028745
234881025 2028819

Nun kann die Datei auch im Dateisystem im Pseudoverzeichnis /.vol über seine Inode gelöscht werden:

$ rm /.vol/234881025/2028745

$ ls -la
drwxrwxrwt  7 root    wheel  238 23 Mai 14:35 .
drwxr-xr-x@ 6 root    wheel  204 14 Aug  2009 ..
-rw-r--r--  1 pronto  wheel  987 23 Mai 14:52 obermann

pronto 2010/05/23 14:45

Folgender Workaround sollte nur in Notfällen verwendet werden. Durch das folgende Kommando werden tiefliegende Informationen im Dateisystem manipuliert

Eine weitere Möglichkeit sich widerspenstiger Dateien auf HFS Dateisystemen zu entledigen, ist die Inode der Datei mit dem Befehl clri3) zurückzusetzen. Im Gegensatz zur vorherigen Lösung, wo die Datei über seine Inode angesprochen wurde, wird hier nur die Inode zurückgesetzt, ohne die Datei als solche anzufassen. Es wird dann nur der Inhalt der Inode gelöscht und nicht die Bereiche auf dem Dateisystem wieder freigegeben, auf die der Inode werweist.

Um das deutlicher auszudrücken, muss man das Prinzip der Inodes verstanden haben. Kurz gefasst zeigt ein Dateiname (inklusive Pfad) auf einen Inode im Dateisystem. Dort sind uA die Benutzerrechte und der Eigentümer der Datei abgelegt, die Grösse, das Datum des letzten Zugriffs, der Dateityp, ein Referenzzähler wie oft ein Dateiname auf diese Datei verweist (Links etc) und die Angabe der Dateisystem Cluster, wo der eigentliche Inhalt der Datei im Dateisystem zu finden ist. All diese Informationen löscht das clri-Kommando, was bedeutet, dass der Dateiname immer noch auf die (jetzt leere) Inode verweist. Wird beim späteren Abspeichern einer Datei dieser Inode wieder verwendet, zeigt dieser zwar auf die neue Datei, jedoch ebenfalls noch der Pointer des alten Dateinamen, da dort immer noch die Information über den Inode vorhanden ist. Wird nun diese alte Datei gelöscht, löscht man tatsächlich auch den Inhalt der der neuen Datei.

Um mit clri zu arbeiten, sollte das Volume auf dem sich das betroffene Dateisystem befindet, nicht gemountet und ein abschliessender fsck Lauf sollte die Arbeit dann abschliessen.



Pronto 2010/06/11 23:12