# 1.103.3

# Durchführung eines allgemeinen Datei-Managements

Beschreibung: Prüfungskandidaten sollten in der Lage sein, die grundlegenden Unix Kommandos zum Kopieren und Verschieben von Dateien und Verzeichnissen zu benutzen. Dieses Lernziel beinhaltet das Durchführen fortgeschrittener Dateiverwaltungs-Operationen wie dem rekursiven Kopieren mehrerer Dateien, das rekursive Löschen von Verzeichnissen und das Verschieben von Dateien, deren Namen einem bestimmten Muster entsprechen. Dies beinhaltet das Benutzen einfacher und komplexerer Wildcard-Muster für das Bestimmen von Dateien sowie die Verwendung von find, um Dateien aufgrund von Typ, Größe oder Zeitstempel ausfindig zu machen und Operationen an ihnen durchzuführen.

Die wichtigsten Dateien, Bezeichnungen und Anwendungen:

- cp
- find
- mkdir
- mv
- ls
- rm
- rmdir
- touch
- File-Globbing (Suchmuster mit Wildcards)

### Kommandos zum Umgang mit Dateien

Grundsätzlich stehen uns unter Linux die gleichen Programme zur Verfügung, wie unter jedem anderen textorientierten System. Wir können Dateien kopieren, verschieben (umbenennen) und löschen. Die jeweils notwendigen Kommandos sind cp (copy), mv (move) und rm (remove).

Im Gegensatz zu MSDOS Befehlen haben diese Linux/Unix-Befehle aber eine Eigenschaft, die nennenswert ist; sie können beliebig viele Dateien bearbeiten. Das heißt, es ist möglich mehrere Dateinamen anzugeben, die kopiert, verschoben oder gelöscht werden sollen.

Das bringt zumindestens beim kopieren und verschieben ein Problem mit sich, das so unter DOS nicht entsteht. DOS-Befehle zum kopieren und verschieben erlauben es, das Ziel der Operation wegzulassen. Fehlt das Ziel, so wird das aktuelle Verzeichnis als Ziel angenommen. Das ist bei Unix Befehlen nicht möglich, und zwar eben genau weil diese Befehle mehrere Dateien bearbeiten können. Dürften wir das Ziel weglassen, so wäre der Befehl, sofern ihm mehrere Dateien mitgegeben wurden, nicht in der Lage zu ermitteln, ob der letzte Parameter eine zu kopierende Datei sein soll oder das Zielverzeichnis... Trotzdem ist das leicht zu verschmerzen, heißt das aktuelle Verzeichnis doch einfach `.` Es reicht also, als letzten Parameter einen Punkt anzugeben, das ist nicht viel Mehraufwand.

Alle drei Befehle sind in der Lage, auch Verzeichnisse zu bearbeiten, cp und rm jedoch nur, wenn ihnen das mittels Kommandozeilenparameter mitgegeben wurde. Näheres dazu siehe unten unter dem Punkt "Rekursive Bearbeitung".

Manchmal ist es einfach nur nötig, eine leere Datei neu anzulegen. Diese Aufgabe kann auf unterschiedliche Weise gelöst werden, hier drei Beispiele:

- Kopieren der Gerätedatei /dev/null in eine Datei
  Die Gerätedatei /dev/null ist eigentlich dazu gedacht, unerwünschte Aufgaben ins Nirwana zu schicken, indem sie dorthin umgeleitet werden. Man kann diese Datei aber dazu nutzen, eine neue, leere Datei anzulegen, inem man schreibt:

        cp /dev/null Neudatei

  Das Ergebnis ist eine leere Datei mit Namen Neudatei.

- Einfache Umleitung
  Mit einem Umleitungssymbol (`>`) kann auch eine leere Datei angelegt werden. Das ist der einzige Fall, in dem in einer Unix-Kommandozeile kein Befehl am Anfang steht. Das Kommando

        >Neudatei

  legt eine leere neue Datei mit Namen Neudatei an.

- Das Programm touch
  Das Programm touch ist eigentlich dazu gedacht, die Zeitmarkierung einer Datei auf das aktuelle Datum und die aktuelle Uhrzeit zu ändern. Die Datei wird sozusagen "berührt" und damit werden die Zeitmarken verändert. Wenn die angegebene Datei jedoch noch nicht existiert, so wird sie angelegt. Der Befehl

        touch Neudatei

  legt also auch eine leere neue Datei mit Namen Neudatei an.

Alle drei Methoden sind im Ergebnis gleich. In jedem Fall haben wir eine leere, neue Datei der Größe 0 Byte.

### Kommandos zum Umgang mit Verzeichnissen

Neue Verzeichnisse werden unter Linux mit dem Befehl mkdir (make directory) erstellt. Mit dem Parameter `-p` oder `--path` kann dieser Befehl sogar einen ganzen Verzeichnisbaum mit beliebig vielen Unterverzeichnissen anlegen.

Leere Verzeichnisse können mit dem Befehl rmdir (remove directory) gelöscht werden. Verzeichnisse können so aber nicht gelöscht werden, wenn sie noch Dateien enthalten. Eine leere Verzeichnishierarchie kann wieder mit dem Parameter `-p` oder `--path` komplett gelöscht werden.

Das aktuelle Arbeitsverzeichnis kann mit dem Befehl cd gewechselt werden. Dieser Befehl funktioniert wie unter DOS auch, allerdings beharrt er auch beim Wechsel in das Mutterverzeichnis (`..`) auf ein Leerzeichen zwischen `cd` und `..`

Wird der Befehl cd ohne Parameter eingegeben, so wechselt man in sein Homeverzeichnis.

Wird der Befehl in der Form

      cd ~username

verwendet, so wechselt man ins Homeverzeichnis des angegebenen Users.

Um sich den Inhalt eines Verzeichnisses anzusehen, gibt es den Befehl ls (list). Er kann auf vielfältige Weise angewandt werden, wichtig sind die folgenden Parameter:

Befehl | Bedeutung
--- | ---
`ls` | Nur die Namen der Dateien und Verzeichnisse werden angegeben
`ls -l` | Langes Listing. Zugriffsrechte, Anzahl der Hardlinks, Eigentümer, Gruppe, Datum, Größe und Namen werden angegeben.
`ls -i` | Die Inode Nummern der Dateien werden mit angegeben.
`ls -a` | Auch die "versteckten" Dateien (deren Namen mit einem Punkt beginnt) werden angezeigt.

Werden ls keine Dateinamen mitgegeben, so zeigt der Befehl den Inhalt des aktuellen Verzeichnisses. Ansonsten wird ls die Dateien eines angegebenen Verzeichnisses oder die Informationen über die angegebenen Dateien zeigen.

### Rekursive Bearbeitung

Die genannten Befehle zum Kopieren, Verschieben und Löschen von Dateien sind alle auch in der Lage, ganze Unterverzeichnisäste zu bearbeiten. Dazu muß folgendes erwähnt sein:

- Der Befehl cp (copy) kann Unterverzeichnisäste nur dann kopieren, wenn ihm als Parameter ein `-r, -R` oder `--recursive` mitgegeben wurde.
- Der Befehl rm (remove) kann Unterverzeichnisse nur dann löschen, wenn ihm als Parameter ein `-r, -R` oder `--recursive` mitgegeben wurde.
- Der Befehl mv (move) verschiebt grundsätzlich auch Unterverzeichnisse, allerdings nur innerhalb der Grenzen einer Partition (eines Dateisystems). Normale Dateien können auch von Partition zu Partition verschoben werden, Verzeichnisse nicht. mv kennt keinen Parameter `-r`
- Der Befehl ls (list) zeigt alle Dateien auch die der Unterverzeichnisse, wenn ihm der Parameter `-R` oder `--recursive` mizgegeben wurde.

### Wildcards

Wildcards (oder auch Jokerzeichen) werden unter Linux nicht von den einzelnen Programmen, sondern von der Shell interpretiert. Alle der genannten Programme können ja - wie oben schon erwähnt - mehrere Dateien als Parameter mitbekommen. Die Shell ersetzt die Wildcard Konstruktion durch eine Liste von passenden Dateinamen - der Befehl selbst bekommt also das Wildcard Konstrukt selbst nie zu sehen.

An Wildcards gibt es unter Linux folgende Möglichkeiten:

Wildcard | Bedeutung
--- | ---
`*` | Das Sternchen steht für eine beliebige Folge beliebiger Zeichen, auch die leere Folge. Ein einzelnes Sternchen meint also alle Dateien mit Ausnahme der Dateinamen, die mit einem Punkt beginnen. Das MSDOS-Konstrukt `*.*` würde nur alle Dateien ansprechen, die irgendwo (auch am Anfang oder Ende) einen Punkt im Namen vorweisen.
`?` | Das Fragezeichen steht für genau ein beliebiges Zeichen.
`[...]` | Eine Menge von Zeichen in eckigen Klammern steht für genau ein Zeichen aus dieser Menge.
`[...-...]` | Weiterentwicklung des Mengenprinzips. So ist es auch möglich, Bereiche anzugeben, ohne alle Zeichen anzugeben. Beispiel `[0-9]` oder `[a-zA-Z]`. Wieder ist genau ein Zeichen aus der Menge gemeint.
`[!...]` | Steht am Anfang der Menge ein Ausrufungszeichen, so wird der Wahrheitswert der Menge umgedreht (NOT) - das Konstrukt steht also für genau ein Zeichen, aber dieses Zeichen darf nicht in der angegebenen Menge stehen.

All diese Konstrukte dürfen beliebig miteinander kombiniert werden, jede einzelne Wildcard darf auch mehrfach vorkommen. So würde etwa die Konstruktion

      [A-Z]*.[0-9][0-9][0-9]_[!A]

jede Datei ansprechen, deren Name mit einem Großbuchstaben (`[A-Z]`) beginnt. Danach darf irgendwas (`*`) folgen, beliebig lang. Dann muß ein Punkt kommen, gefolgt von drei Ziffern (`[0-9]`). Dem folgt ein Unterstrich und dann ein beliebiges Zeichen - nur eben kein A.

### Dateien finden mit find

Ein universelles Werkzeug für den Umgang mit Dateien ist das Programm find. Es ermöglicht das Suchen von Dateien anhand aller denkbaren Kriterien wie

- Namensmuster
- Zugriffs-, Modifikations- und Statusveränderungsdatum
- Eigentümer und Gruppenzugehörigkeit
- Dateiart und Zugriffsrecht
- Größe
- ...

find ermöglicht es darüber hinaus, beliebige Befehle auf die gefundenen Dateien anzuwenden, sie also zu löschen, kopieren, verschieben oder was auch immer. Im Abschnitt 1.104.8 - Auffinden von Systemdateien und Platzieren von Dateien an den korrekten Ort wird der Befehl genauer besprochen.