Warum lässt sich eine Datei, die mir gehört, nicht löschen?

Terminal Icon

Das dürfte schon vielen passiert sein. Eine Datei lässt sich einfach nicht verändern oder löschen. In vielen Fällen gibt es vermutlich einen triftigen Grund dafür (Systemdateien oder Dateien ohne die ein Programm einfach nicht laufen würde). Wenn es sich aber um Dateien handelt, die wir selbst auf die eine oder andere Weise auf die Festplatte importiert hat, wundert man sich dann doch, warum wir die Datei nicht verschieben oder löschen können. Es könnte sein, dass ein wohlmeinendes Programm versucht uns vor uns selbst zu beschützen. Aber das können wir leicht überprüfen.

Am einfachsten nähern wir uns der Thematik indem wir eine Datei erzeugen und diese so einstellen, dass wir sie nicht mehr löschen oder verändern können. Dazu öffnen wir das Programm Terminal, suchen uns ein geeignetes Verzeichnis oder legen es an, und erzeugen eine Datei.

Gehen wir einmal von einer Datei namens mytestfile.txt aus (ja, ich weiss, nicht sonderlich kreativ). Momentan handelt es sich um eine ganz normale Datei, die ich per touch mystestfile.txt in dem Directory example angelegt habe, wie wir im Terminal problemlos sehen können:

leMini:example erik$ ls -l mytestfile.txt 
-rw-r--r--  1 erik  demo  16 11 Apr 10:02 mytestfile.txt

Soweit, so normal. Sehen wir uns die Datei einmal mit der Option -lO mit ls an:

leMini:example erik$ ls -lO mytestfile.txt 
-rw-r--r--  1 erik  demo  - 16 11 Apr 10:02 mytestfile.txt

Aha! Wenn wir die zwei Ausgaben von ls vergleichen, dann fällt auf, dass im zweiten Fall ein - angezeigt wird. Es scheint also noch Platz für Dinge zu sein, die sich einstellen lassen. die Option -lO zeigt die so genannten flags an. Um diese zu setzen benutzen wir den Befehl chflags und mit ihm, für unsere Zwecke, die Option uchg:

leMini:example erik$ chflags uchg mytestfile.txt

Mit der Option -lO können wir uns anzeigen lassen, ob das flag uchg gesetzt wurde:

leMini:example erik$ ls -lO mytestfile.txt 
-rw-r--r--  1 erik  demo  uchg 16 11 Apr 10:02 mytestfile.txt

Soweit, so unspektakulär. Aber, jetzt wird’s interessant. Versuchen wir doch einmal unsere eigene Datei zu löschen:

leMini:example erik$ rm mytestfile.txt 
override rw-r--r--  erik/demo uchg for mytestfile.txt? y
rm: mytestfile.txt: Operation not permitted

Whiskey-Tango-Foxtrott-Moment™-Alarm! Das Betriebssystem lässt nicht mehr zu, dass wir die Datei entfernen; gleiches gilt übrigens auch für alle anderen Manipulationen an der Datei oder ihren Rechten. Wenn wir uns die Rechte an der Datei mit ls -l mytestfile.txt ansehen, stellen wir fest, dass die Datei uns gehört und wir theoretisch auch die nötigen Schreibrechte haben sollten. Die Betonung liegt hierbei auf theoretisch. Die Abfrage auf den rm-Befehl hat uns bereits den entsprechenden Hinweis gegeben: override rw-r--r-- erik/demo uchg for mytestfile.txt? Aufgedröselt liest sich das Ganze so:

  • Überschreiben von rw
  • User erik
  • Gruppe demo
  • flag uchg

Wir haben es also mit dem flag uchg (“user immutable”) zu tun, das wir in diesem Fall ja auch selbst gesetzt haben. Das Wort “immutable” bedeutet “unveränderbar”, und OS X befolgt diese Anweisung buchstabengetreu. (Alles andere wäre auch eine Überraschung, oder?) Um das flag wieder zu entfernen, benutzen wir chflags mit nouchg, also “no uchg”:

leMini:example erik$ chflags nouchg mytestfile.txt

Dann überprüfen wir, ob das flag wirklich entfernt wurde:

leMini:example erik$ ls -lO mytestfile.txt 
-rw-r--r--  1 erik  demo  - 16 11 Apr 10:02 mytestfile.txt

Jetzt können wir die Datei problemlos (und ohne Abfrage!) löschen und überprüfen, ob sie wirklich gelöscht wurde:

leMini:example erik$ rm mytestfile.txt 

leMini:example erik$ ls -al
total 0
drwxr-xr-x  2 erik  demo   68 11 Apr 10:05 .
drwxr-xr-x  3 erik  demo  102 11 Apr 09:50 ..

Fazit: Wenn wir auf eine Datei stossen welche wir verändern oder löschen möchten, und sich diese erfolgreich widersetzt, dann sollten wir einfach mit ls -lO nachsehen, ob uns nicht ein gesetztes uchg-Flag daran hindert. Bevor wir das flag mit chflags nouchg entfernen, sollten wir allerdings überprüfen, ob es nicht aus einem wichtigen Grund gesetzt wurde. Anders gesagt: Benutzung auf eigene Gefahr!

Wer sich für die anderen möglichen flags interessiert, sollte sich die man-page mit man chflags in Ruhe durchlesen.

Speak Your Mind

*