Dateien und Verzeichnisse in Linux
Inhaltsverzeichnis
- Datei- und Verzeichnisrechte
- Dateien und Verzeichnisse vergleichen
- Verzeichnisse rekursiv kopieren
- Dateien mit bestimmtem Inhalt finden
- Unicode-Text rekursiv in Dateien ersetzen
- Rekursiv einen Teil aus Verzeichnisnamen entfernen
- Mehrfache Leerzeichen aus Dateinamen entfernen
- Ungültige Namen in NTFS-Dateisystem verhindern
- Defekte Sektoren auf einer Festplatte finden
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 und seinen Unterverzeichnissen 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.txtVerzeichnisse 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 meldVerzeichnisse rekursiv kopieren
Der Befehl rsync ermöglicht das rekursive Kopieren von Verzeichnissen samt symbolischen Links etc.:
sudo rsync -a source/ destAchtung: 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/ destDie Option
-lkopiert auch Symlinks als Symlinks.Die Option
--deletelöscht Dateien/Verzeichnisse im Zielverzeichnis, die im Quellverzeichnis nicht existieren. Hier ist Vorsicht geboten, um nicht irrtümlich Daten zu löschen.
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 destDie 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 enthalten.
Option
Paktiviert einfachere und leistungsstärkere Reguläre Ausdrücke aus Perl.Option
obegrenzt die Ausgabe auf die Fundstelle.Option
zist nötig für mehrzeilige Suche, dazu werden alle Zeilenumbrüche in der Datei durch ein Nullzeichen ersetzt und dann gesucht. Nachteil: Mit dieser Option kann man sich nicht die Zeilen rund um die Fundstelle (Option-A <Zeilenanzahl>(after),-B <Zeilenanzahl>(before) oder-C <Zeilenanzahl>(context)) anzeigen lassen. Über.{0,<Zeichenanzahl>}kann man jedoch einige Zeichen davor und danach auch erfassen.Option
ngibt Zeilennummern der Treffer aus (nicht kompatibel zu Optionz).
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.txtSuche 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. B./z.\xe2\x80\xafB./g' {} +Anmerkungen:
Anstelle von
-name example.txtkann auch ein Muster wie-name *.txtangegeben werden.Aufgrund von Einschränkungen von
sedmüssen Unicode-Zeichen über die entsprechende Sequenz von\x…-Angaben maskiert werden. Die Option-raktiviert die Angabe von Bytes mittels\x….Das
+am Ende bewirkt, daß alle Dateinamen an einen Aufruf vonsedübergeben werden. Der Befehlsedunterstützt die Angabe beliebig vieler Dateinamen. Andernfalls würdesedfür jede Datei einzeln aufgerufen werden.Als Trennzeichen der Angabe zu Such- und Ersetzungstext kann anstelle von
/auch ein Zeichen wie|genutzt werden. Das erweist sich bei der Verarbeitung von HTML als praktisch, da in HTML üblicherweise der standardmäßig verwendete Schrägstrich bei schließenden Tags Verwendung findet. Alternativ könnte bei der Bearbeitung von HTML-Code der Schrägstrich maskiert werden.Die einzelnen Bytes des Unicode-Zeichens lassen sich mittels
echo <Zeichen/Zeichenfolge> | hexdump -Cermitteln. Das letzte Byte0aist dabei wegzulassen. Außerdem läßt sich die Bytefolge eines Zeichens online ermitteln (für UTF-8 siehe die entsprechende Angabe).
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///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, unter Linux Mint hat diese den Pfad /etc/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.
Die Option windows_names kann auch beim Einhängen eines VeraCrypt-Containers mit NTFS-Dateisystem gesetzt werden. Gibt man UID und GID des aktuellen Benutzers an, ist lesender und schreibender Zugriff auf das Dateisystem möglich (schreibender Zugriff setzt voraus, dass das NTFS-Dateisystem mit der Containerdatei fehlerfrei ist, ggf. ist eine Reparatur durch Aufruf von sudo ntfsfix /dev/<Gerätename> erforderlich):
veracrypt \
--fs-options="windows_names,uid=1000,gid=1000,umask=000" \
container.hc \
/media/veracrypt1Defekte 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/<Gerätename> > ~/badblocks-result.txtBei 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/<Gerätename> > ~/badblocks-result.txt