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 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
Die Option
-l
kopiert auch Symlinks als Symlinks.Die Option
--delete
lö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 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.
Option
P
aktiviert einfachere und leistungsstärkere Reguläre Ausdrücke aus Perl.Option
o
begrenzt die Ausgabe auf die Fundstelle.Option
z
ist 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
n
gibt 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.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. B./z.\xe2\x80\xafB./g' {} +
Anmerkungen:
Anstelle von
-name example.txt
kann auch ein Muster wie-name *.txt
angegeben werden.Aufgrund von Einschränkungen von
sed
müssen Unicode-Zeichen über die entsprechende Sequenz von\x…
-Angaben maskiert werden. Die Option-r
aktiviert die Angabe von Bytes mittels\x…
.Das
+
am Ende bewirkt, daß alle Dateinamen an einen Aufruf vonsed
übergeben werden. Der Befehlsed
unterstützt die Angabe beliebig vieler Dateinamen. Andernfalls würdesed
für jede Datei einzeln aufgerufen werden.Als Trennzeichen der Angabe zu Such- und Ersetzungstext wurde 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 -C
ermitteln. Das letzte Byte0a
ist 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/<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