Arbeiten mit Dateien und Verzeichnissen im Terminal

Im folgenden die wichtigsten Commands für das Arbeiten mit Dateien und Verzeichnissen im Terminal.

cp

cp ist ein Hilfstool zum kopieren von Dateien

Optionen

Option Beschreibung
-a oder --archive Beibehaltung von Besitzer-, Gruppen- und Zugriffsrechten und Erstellungs-, Modifizierungs- und Zugriffsdaten (entspricht -dR –preserve=all)
-b oder --backup Sichert Dateien vor dem Überschreiben, wenn diese unterschiedlich sind
-d erhält symbolische Links, folgt ihnen aber nicht beim Kopieren (entspricht -P --preserve=links)
-i oder --interactive fragt vor Überschreiben nach
-l oder --link kopiert nicht, sondern erstellt harten Link
-n oder --no-clobber niemals vorhandene Dateien überschreiben (=-i wird wirkungslos=)
-p (klein) oder --preserve=mode,ownership,timestamps erhält Standard-Dateiattribute wie Zeitpunkt des letzten Schreibzugriffs
-P (groß) oder --no-dereference Symbolische Links als symbolische Links kopieren, statt den Links in der Quelle zu folgen
-r oder -R oder --recursive Verzeichnisse rekursiv kopieren (Unterverzeichnisse eingeschlossen)
-s oder --symbolic-link kopiert nicht, sondern erstellt symbolischen Link
-u oder --update kopiert nur, wenn Zieldatei älter als Quelldatei
-v oder --verbose Durchgeführte Tätigkeiten “erklären” / anzeigen

Beispiele

Dateien mit bestimmtem Anfangsbuchstaben da*.txt, do*.odt kopieren, wenn neuer als bestehende, und Kopierfortschritt anzeigen:

cp -uv da*.txt do*.odt /home/BENUTZER/Dokumente

Zeigt, welche Datei im Moment kopiert wird:

lsof -ad3-999 -c cp

mv

Verschieben von Dateien/Verzeichnissen

Optionen

Option
-i oder --interactive fragt vor dem Überschreiben nach
-u oder --update verschiebt nur wenn Zieldatei älter
-v oder --verbose zeigt Verschiebe-Fortschritt an

Beispiele

Umbenennen einer Datei am gleichen Ort:

mv datei_a.txt datei_b.txt 

Vershieben aller Dateien mit einer Bestimmten Endung:

mv *.txt /path/to/target/folder
# oder
mv /path/to/source/folder/*.txt /path/to/target/folder

Verzeichnis umbenennen:

# im gleichen Verzeichnis
mv ordner1 ordner2 

Zeigt, welche Datei im Moment verschoben/umbenannt wird:

lsof -ad3-999 -c mv

find

Optionen

Kriterium Beschreibung
-name DATEI sucht nach dem Namen DATEI. Werden Platzhalter verwendet, müssen sie maskiert werden, sonst interpretiert sie schon die Shell. Beispiele: \*.txt oder "???.t*xt"
-iname DATEI sucht nach dem Namen DATEI, ohne Beachtung der Groß- und Kleinschreibung.
-type T sucht nach nur einem Typ, z.B. mit f (=file) echte Dateien oder mit d (=directory) Verzeichnisse.
-mtime n sucht nach Dateien, deren Inhalt vor n bis n+1 Tagen geändert (m=modified) wurde.
-mtime +n sucht nach Dateien, deren Inhalt älter als n+1 Tage ist.
-mtime -n sucht nach Dateien, deren Inhalt jünger als n Tage ist.
-ctime n sucht nach Dateien, deren Name oder Status (Modus, Besitzer oder Gruppe) vor n bis n+1 Tagen geändert (c=changed) wurde.
-atime n sucht nach Dateien, auf die zuletzt vor n bis n+1 Tagen zugegriffen (a=accessed) wurde. (Hinweis: Die Aussagekraft der Datei-Zugriffszeit ist stark von den Einhängeoptionen atime,
noatime und relatime abhängig.)
-mmin n sucht nach Dateien, deren Inhalt vor n-1 bis n Minuten geändert wurde. (Achtung: andere Zählweise als bei -Xtime)
-mmin +n sucht nach Dateien, deren Inhalt älter als n Minuten ist. (Achtung: andere Zählweise als bei -Xtime)
-mmin -n sucht nach Dateien, deren Inhalt jünger als n Minuten ist. (gleiche Zählweise als bei -Xtime)
-daystart misst für alle darauf folgenden -Xtime- und -Xmin-Kriterien ab 0:00 h des nächsten Tages, also ab Mitternacht.
-newer DATEI sucht nach Dateien, deren Inhalt nach dem von DATEI verändert wurde.
-size n[cwbkMG] sucht Dateien die n Zuordnungseinheiten belegen. Folgende Multiplikatoren können zusätzlich verwendet werden: c für Bytes, w für Zwei-Byte-Wörter, b für 512-Byte-Blöcke (Standard),
k für KiB (Kibibyte), M für MiB, G für GiB.
-user BENUTZER sucht nur nach Dateien des Benutzers BENUTZER.
-nouser sucht nach Dateien, deren User-ID keinem Benutzer entspricht.
-nogroup sucht nach Dateien, deren Gruppen-ID keiner Gruppe entspricht.
-maxdepth n sucht ab dem Startpunkt nur n Verzeichnisse tief. Bezeichnet dieser ein Verzeichnis – z.B. implizit das aktuelle Verzeichnis – zählen dessen Einträge schon zu Tiefe 1.
-depth sucht erst rekursiv im Inhalt der Verzeichnisse, bevor das Verzeichnis selbst untersucht wird. (Standard bei -delete Aktion)

Typische Aktionen für find

Aktion Beschreibung
-fprint DATEI gibt die gefunden Dateinamen nicht auf die Standardausgabe (Bildschirm) aus, sondern schreibt diese in die Datei DATEI.
-exec KOMMANDO {} ; wendet auf alle Funde den Shellbefehl KOMMANDO an. {} steht dabei als Platzhalter für die gefundenen Dateinamen. Das Zeichen ; terminiert den von find
aufzurufenden Shellbefehl. Damit es nicht unbeabsichtigt von der Shell interpretiert wird, muss es mit \ oder zwei umschließenden " maskiert werden.
-execdir KOMMANDO {} + wendet auf die Funde den Shellbefehl KOMMANDO an. Im Gegensatz zu -exec wird das Kommando im Verzeichnis, in dem die Datei liegt, ausgeführt. Das + bewirkt, dass
viele Funde (bzw. hier viele eines gleichen Verzeichnisses) auf einmal an KOMMANDO übergeben werden, was die Ausführung stark beschleunigen kann.
Das + kann statt dem ; (ebenso wie bei -exec) nur verwendet werden, wenn {} der letzte Parameter von KOMMANDO ist.
-ok KOMMANDO {} ; Wie -exec, allerdings wird vor jeder Aktion eine Bestätigung erfragt. {} steht dabei als Platzhalter für die Funde.
-okdir KOMMANDO {} + Wie eine Kombination von -ok und -execdir, d.h. es wird eine Bestätigung erfragt, und das Kommando wird im Fundordner ausgeführt.
-print erzwingt die Ausgabe der gefunden Dateinamen, auch wenn diese als Parameter für eine andere Aktion zunächst verschluckt wurden.
Mit -printf FORMAT kann die Ausgabe auch vielfältig gestaltet werden.
-delete löscht die gefundenen Dateien und leeren Verzeichnisse.

Beispiele

zeigt alle Dateien/Verzeichnisse an, die einen Part /folder-a/ in der Pfad-Angabe haben

find . -path '*/folder-a/*'

Findet alle Verzeichnisse mit dem Namen “folder-a”

find . -name "folder-a" -type d

Leere Dateien auflisten:

find . -depth -type f -empty

findet alle Unterverzeichnisse die leer sind und entfernt diese:

find . -depth -type d -empty -exec rmdir {} \;

Findet alle Dateien mit der Datei-Endung .jpg und löscht diese:

find . -name "*.jpg" -type f -delete

chmod auf allen unterverzeichnissen in einem verzeichnis:

find /path/to/folder -type d -exec chmod 750 {} \;

chmod auf allen Dateien in einem verzeichnis (rekursiv!):

find /path/to/folder -type f -exec chmod 644 {} \;