Dateien und Verzeichnisse in Linux

Inhaltsverzeichnis

Datei- und Verzeichnisrechte

Jede Datei und jedes Verzeichnis in Linux hat genau einen Besitzer (owner) und optional genau eine Gruppe (group), der die Datei bzw. das Verzeichnis gehört.

Für jede Datei und jedes Verzeichnis können Rechte (Lesen, Schreiben, Ausführen) an den Besitzer (owner), die Besitzergruppe (group) und andere Benutzer (other) vergeben werden.

Der Name der Gruppe kann z. B. users sein, unter Linux Mint wird aber automatisch eine Gruppe erstellt, die denselben Namen wie der Benutzer trägt, z. B. Benutzer max, Gruppe max.

Linux Mint zeigt zwar bei ls -l Benutzer- und Gruppennamen wie max an, tatsächlich wird im Dateisystem aber nur die zugehörige Benutzer-ID (UID) gespeichert. Die UID kann über id -u <Benutzername> ermittelt werden, die Gruppen-ID (GID) des Benutzers über id -g <Benutzername>. Ein Benutzer kann Mitglied mehrerer Gruppen sein, diese Gruppen können über id -G <Benutzername> abgefragt werden. Alle Gruppennamen und -IDs eines Benutzers können mittels id <Benutzername> angezeigt werden.

Besonderheiten bei Zugriffsrechten von ext4 in Linux Mint

Das Dateisystem ext4 speichert für jede Datei und jedes Verzeichnis Zugriffsrechte. Dadurch kann es dazu kommen, dass auf anderen Linux-Systemen die UIDs/GIDs der Benutzer/Gruppen nicht übereinstimmen und kein Zugriff möglich ist.

Unter Linux Mint wird für den ersten Benutzer die UID 1000 und für die entsprechende Gruppe die GID 1000 vergeben. Auf anderen Systemen mit gleicher UID/GID lassen sich die Dateien/Verzeichnisse problemlos nutzen. Verwendet ein System aber andere UIDs/GIDs oder versucht ein anderer Benutzer, auf eingeschränkte Objekte zuzugreifen, schlägt dies fehl. Mittels eines Benutzers mit root-Rechten kann jedoch der Besitzer (UID/GID) der Dateien/Verzeichnisse geändert werden, sodaß ein Zugriff wieder möglich ist.

Zugriffsrechte von Dateien/Verzeichnissen ermitteln

Die Zugriffsrechte können über ls -l bzw. ls -l <Datei/Verzeichnis> angezeigt werden.

Besitzer von Dateien/Verzeichnissen ändern

Der Besitzer von Dateien/Verzeichnissen kann über chown geändert werden. Dies ist für eine Datei/ein Verzeichnis mittels chown <Benutzername des neuen Besitzers> <Datei/Verzeichnis> möglich. Um den Besitzer für ein Verzeichnis und alle darin enthaltenen Dateien/Verzeichnisse zu übernehmen, kann chown rekursiv aufgerufen werden:

sudo chown -R <Benutzername>:<Gruppenname> <Verzeichnis>

Um nur den Besitzer-Benutzer zu ändern, ist <Benutzername>: anzugeben, für die Gruppe :<Gruppenname>.

Achtung: chown folgt auch symbolischen Links und ändert den Besitzer des Verknüpfungsziels.

Zugriffsrechte von Dateien/Verzeichnissen ändern

Zugriffsrechte von Dateien/Verzeichnissen können mittels chmod verändert werden.

Rechte von Verzeichnissen anpassen

Nur der Besitzer soll das Verzeichnis öffnen können (gesetzte Rechte: d rwx --- --- (user, group, other)):

chmod 700 <Verzeichnis>
# Entspricht `chmod a+rwx,g-rwx,o-rwx <Verzeichnis>`

Rekursiver Aufruf, um die Zugriffsrechte aller Verzeichnisse in einem Verzeichnis anzupassen:

find . -type d -exec chmod 700 {} +

Rechte von Dateien anpassen

Nur der Besitzer soll die Datei lesen, schreiben und ausführen können (gesetzte Rechte: rw- --- --- (user, group, other)):

chmod 600 <Datei>
# Entspricht `chmod a+rwx,u-x,g-rwx,o-rwx <Datei>`

Rekursiver Aufruf für alle Dateien in einem Verzeichnis und seinen Unterverzeichnissen:

find . -type f -exec chmod 600 {} +

Alternativ können die Zugriffsrechte auch analog zur Vorgabe unter Linux Mint (diese Variante verwende ich) angepasst werden: Nur Besitzer und Gruppe können lesen und schreiben, andere können nur lesen (gesetzte Rechte: rw- rw- r-- (user, group, other)):

find . -type f -exec chmod 664 {} +

Nur Verzeichnisse ausführbar machen

Ist das Execute-Bit in den Zugriffsrechten einer Datei gesetzt, können diese als Programm ausgeführt werden. Das kann ein Sicherheitsrisiko darstellen. Verzeichnisse hingegen müssen als ausführbar markiert sein, damit darauf zugegriffen werden kann.

Folgender Aufruf macht rekursiv alle Verzeichnisse ausführbar und markiert alle Dateien als nicht ausführbar:

chmod -R -x+X .

Dateien und Verzeichnisse vergleichen

Dateien lassen sich mittels des Befehls cmp vergleichen:

cmp -l file1.txt file2.txt

Verzeichnisse können mit dem Befehl diff verglichen werden. Die Option -q meldet nur Dateien/Verzeichnisse, die sich unterscheiden; -r durchsucht Verzeichnisse rekursiv:

diff -qr directory1/ directory2/

Achtung: diff folgt auch feherhaften symbolischen Links und gibt diese Links als Datei oder Verzeichnis nicht gefunden aus. Bei BackInTime-Backups kann es sich hierbei um lock-Dateien handeln. Durch Angeben der Option --no-dereference können fehlerhafte Symlinks ignoriert werden:

diff -qr --no-dereference directory1/ directory2/

Das Programm meld ermöglicht einen grafischen Datei- und Verzeichnisvergleich. Unter Linux Mint kann es wie folgt installiert werden:

sudo apt install meld

Verzeichnisse rekursiv kopieren

Der Befehl rsync ermöglicht das rekursive Kopieren von Verzeichnissen samt symbolischen Links etc.:

sudo rsync -a source/ dest

Achtung: Nach dem Quellpfad ist ein Schrägstrich (»/«) anzugeben, sonst wird das Verzeichnis source aus der Quellverzeichnisangabe source in dest ebenfalls erstellt.

Mittels rsync können Verzeichnisse (möglichst) exakt repliziert werden. Das ist etwa notwendig, um das Timeshift-Verzeichnis oder BackInTime-Verzeichnis an eine andere Stelle zu verschieben:

sudo rsync -rlptgoDHAX --delete source/ dest

Das BackInTime-Backup-Verzeichnis kann wie folgt repliziert werden (kein Schrägstrich am Ende der Quelle, damit das Verzeichnis backintime im Zielverzeichnis durch rsync angelegt wird):

sudo rsync -rlptgoDHAX source/backintime dest

Die Kopie des Backups kann anschließend mittels diff auf Vollständigkeit überprüft werden:

diff -qr --no-dereference source/ dest/

FIFOs, Sockets etc. können mit diff nicht sinnvoll verglichen werden, Fehlermeldungen wie Datei source/.request-queue ist ein FIFO, während Datei dest/.request-queue ein FIFO ist können daher ignoriert werden.

Dateien mit bestimmtem Inhalt finden

Finde alle Dateien mit Namen example.txt rekursiv (Option r) in allen Verzeichnissen im aktuellen Verzeichnis (.), die eine bestimmte Zeichensequenz enthalen.

Suche nach 3 Zeilen, die nur keines oder mehrere Leerzeichen gefolgt von einem Punkt und einem Windows-Zeilenumbruch enthalten:

grep -Przo --include=example.txt '.{0,10}\r\n\s*\.\r\n\s*\.\r\n\s*\.\r\n.{0,10}' .

Suche nach Zeilen, die nur keines oder mehrere Leerzeichen gefolgt von einem Punkt und einem \r (carriage return) enthalten. In Windows bestehen Zeilenumbrüche aus \r\n, aber nach \n kann nicht gesucht werden, da die Suche zeilenweise erfolgt und die Zeilen am \n getrennt werden. Das \r am Ende des Treffers hat zur Folge, daß der Treffer in der Terminalausgabe nicht sichtbar ist. Dieses Problem läßt sich durch Weiterleiten der Ausgabe in eine Datei umgehen:

grep -Prn -C 2 --include=example.txt '^\s*\.\r' . > result.txt

Suche nach allen Zeilen, die nur aus einem oder mehreren Leerzeichen bestehen:

grep -Prn -C 2 --include=example.txt '^\s+\r' .

Unicode-Text rekursiv in Dateien ersetzen

Mittels der Befehle find und sed lassen sich Texte rekursiv in Dateien suchen und ersetzen:

find -name example.txt -exec sed -i -r 's/z.&thinsp;B./z.\xe2\x80\xafB./g' {} +

Anmerkungen:

Rekursiv einen Teil aus Verzeichnisnamen entfernen

Suchmuster und Ersatz sind in einen regulären Ausdruck (Perl-Syntax) eingebettet und müssen entsprechend maskiert werden:

find . -type d -execdir rename -v 's/<Suchmuster>/<Ersatz>/g' {} +

Mehrfache Leerzeichen aus Dateinamen entfernen

Mehrfache Leerzeichen in Dateinamen von Dateien im aktuellen Verzeichnis lassen sich durch einfache Leerzeichen ersetzen:

find . -maxdepth 1 -type f | rename -v 's/\s+/ /g'

Zum rekursiven Reduzieren der Leerzeichen in Verzeichnis- und Dateinamen kann folgender Aufruf verwendet werden (die Option -d von rename gibt an, daß jeweils nur der „Dateiname“, also der letzte Teil der Pfadangabe, verändert wird):

find . -execdir rename -v -d 's/\s+/ /g' {} +

Ungültige Namen in NTFS-Dateisystem verhindern

Um zu verhindern, daß auf einem Datenträger mit NTFS-Dateisystem Dateien/Verzeichnisse mit unter Windows ungültigen Namen erstellt werden können, kann über die Laufwerksverwaltung (bzw. manuell in der Datei fstab) die Option windows_names den Mountoptionen hinzugefügt werden.

Durch Deaktivieren von Vorgabe für Benutzersitzung in der Laufwerksverwaltung wird eine für den Menschen schlecht lesbarer Bezeichnung des Einhängepunkts vergeben. Dieser kann z. B. auf /media/<Benutzername>/<Laufwerksbezeichnung> geändert werden.

Defekte Sektoren auf einer Festplatte finden

Datenträger lassen sich mittels des Befehls badblocks auf fehlerhafte Sektoren untersuchen. Die Ausgabe mit dem Ergebnis der Überprüfung kann in eine Datei umgeleitet werden:

sudo badblocks -v /dev/sda > ~/badblocks-result.txt

Bei Festplatten größer als 4 TB muß die Blockgröße vergrößert werden, damit der Test durchgeführt werden kann:

sudo badblocks -b 4096 -v /dev/sda > ~/badblocks-result.txt