# Verzeichnisse und Dateien

Anmerkung:

In allen weiteren Beispielen sind Kommandofolgen, die die Rechte des Systemadministrators root erfordern, symbolisch durch das Prompt

`root@sonne>`

dargestellt; Kommandofolgen, die dem "gewöhnlichen" Nutzer zur Verfügung stehen, werden durch

`user@sonne>`

eingeleitet.

Dateien dienen zum Speichern von Daten. Verzeichnisse gruppieren die Dateien in einer baumartigen Struktur. Ein Baum besitzt (falls er nicht gefällt wurde) eine Wurzel, also ist der Ursprung aller Verzeichnisse das root-Verzeichnis "/". Mit

`user@sonne> cd /`

wechselt man in das Wurzelverzeichnis cd - change directory, wo ein Listing (ls - list) auf den meisten Systemen die folgende Ausgabe liefern sollte:

`user@sonne> ls / bin dev home mnt proc tmp boot etc lib msdos root usr cdrom floppy lost+found opt sbin var`

Wollen wir wieder nach Hause (`/home/user`), geben wir einfach

`user@sonne> cd`

ein und landen in unserem Home-Verzeichnis. Das Kommando `cd` wertet im Falle fehlender Argumente (oft wird auch von Optionen gesprochen) die Shell-Variable `HOME` aus, die den Pfad zum entsprechenden Verzeichnis enthält. Den Inhalt der Shell-Variablen kann man sich mittels des Aufrufes

`user@sonne> echo $HOME /home/user`

betrachten. Weitere wichtige Shell-Variablen seien an dieser Stelle kurz erwähnt:

Variable | Inhalt
`DISPLAY` | Name des Displays der Standardausgabe
`HOSTNAME` | Name des Rechners
`MANPATH` | Suchpfade für Manual pages
`PATH` | Suchpfade für Programme
`SHELL` | Enthält den Namen der Shell (z.B. bash)
`USER` | Nutzerkennung

Gibt man

`user@sonne> echo $ [Tab][Tab] $_ $HOSTTYPE $MAIL $PS2 $BASH $IFS $MAILCHECK $PS4 $BASH_VERSINFO $ignoreeof $MANPATH $PWD ...`

ein, erhält man eine Auflistung aller Shell-Variablen. `echo` schreibt sein Argument auf die Standardausgabe, vergisst man das "$"-Zeichen, würde `echo` den Namen der Shellvariablen wiedergeben.

`user@sonne> mkdir new_directory`

erstellt ein neues Verzeichnis new_directory. Betrachtet man dessen Inhalt:

`user@sonne> ls -a new_directory . ..`

findet man "." für das Verzeichnis selbst und "..", was auf das übergeordnete Verzeichnis verweist.

Möchte man schließlich das Verzeichnis wieder löschen, trommelt man

`user@sonne> rmdir new_directory`

auf die Tastatur und vermisst beim nächsten Listing das Verzeichnis, sofern dieses leer war! Das zum Löschen von Dateien gedachte Kommando `rm` - remove kann auch auf Verzeichnisse angewendet werden:

`user@sonne> rm -r new_directory`

Mit der Option "-r" (für rekursiv) entfernt `rm` auch alle Unterverzeichnisse und letztlich das Verzeichnis selbst.

Erinnert man sich des Namens des aktuellen Verzeichnisses nicht, hilft

`user@sonne> pwd`

(print working directory), das den Namen (mit Pfad) wiedergibt.

Wenden wir uns nun den Dateien zu. Wie das Löschen funktioniert, haben wir schon kennen gelernt: mit dem Kommando `rm`. Zum Erstellen neuer Dateien gibt es mehrere Möglichkeiten. Die Einfachste ist

`user@sonne> touch Dateiname`

das eine leere Datei anlegt, sofern der Dateiname noch nicht im aktuellen Verzeichnis existierte. Gab es sie bereits, ändert `touch` ihr letztes Änderungs- und Zugriffsdatum (und das ist die wahre Berufung des Kommandos;-); der Grund hierfür wird uns im Zusammenhang mit `make` klar werden.

Ausgaben von Kommandos lassen sich in eine Datei umlenken, zum Beispiel legt

`user@sonne> ls > root_inhalt`

eine Datei root_inhalt mit folgendem Inhalt an:

`user@sonne> cat root_inhalt bin dev home mnt proc tmp boot etc lib msdos root usr cdrom floppy lost+found opt sbin var`

Den Inhalt einer solchen Datei schaut man sich am besten mit einem so genannten Pager an:

`user@sonne> less root_inhalt`

oder mit

`user@sonne> more root_inhalt`

Pager haben gegenüber Editoren (diese behandeln wir später) den Vorteil, dass man nicht aus Versehen den Inhalt der Datei ändern kann. Ob man `more` oder `less` bevorzugt, ist Geschmackssache; beide Pager unterscheiden sich nur geringfügig in der Bedienung (beide beendet man durch [Q]).

Bei sehr langen Dateien interessiert man sich meist nur für die ersten/letzten Zeilen (z.B. werden in`/var/log/messages` alle Systemmeldungen protokolliert, wobei man den Grund für ein ungewöhnliches Systemverhalten sicher am Ende der Datei finden wird).

`user@sonne> head Dateiname`

zeigt die ersten (Voreinstellung 10) Zeilen der Datei Dateiname an,

`user@sonne> tail Dateiname`

dagegen die letzten (10) Zeilen.

Für das Betrachten kurzer Dateien (deren gesamter Inhalt auf einer Bildschirmseite darstellbar ist) eignet sich auch folgendes Kommando:

`user@sonne> cat /etc/passwd`

`cat` schreibt in diesem Beispiel den Inhalt der Passwortdatei auf die Standardausgabe.

Es soll nützlich sein, Dateien unter Umständen kopieren zu können. Auch an ein solches Kommando haben die UNIX-Götter gedacht:

`user@sonne> cp quelle ziel`

quelle und ziel sind nun zwei Dateien mit identischem Inhalt.

Eine andere Möglichkeit zum Kopieren bietet die Umleitung von Ausgaben:

`user@sonne> cat < quelle > ziel`

Der Unterschied in der Verwendung der Kommandos `cp` und `cat` besteht im Erhalt der Zugriffsrechte der Datei bei ersterem Kommando, während im Falle von `cat` die Zieldatei die durch `umask` voreingestellten Rechte erhält.

Aber warum sollte man Dateien mit gleichem Inhalt mehrfach speichern? Einziger Grund hierfür kann doch nur der Zugriff auf dieselbe Datei aus verschiedenen Verzeichnissen heraus sein. Jedoch wird hiermit Speicherplatz verschwendet. Abhilfe schaffen hier so genannte Links, also Verweise auf Dateien/Verzeichnisse.

`user@sonne> ln quelle ziel user@sonne> ln -s quelle ziel2`

In der ersten Zeile wird ein so genannter statischer (fester, harter) Link angelegt. ziel ist jetzt nur ein anderer Name für datei; eine Änderung von ziel ändert auch den Inhalt von datei. Wird einer der Dateinamen gelöscht, kann über den anderen Namen weiter auf den Inhalt zugegriffen werden.

Anders verhält sich der Link der zweiten Zeile, ein so genannter symbolischer Link. Im Unterschied zum statischen Link, wo ein neuer Verzeichniseintrag auf den Verwaltungseintrag (Inode) der Ursprungsdatei erzeugt wird, speichert der symbolische Link in einem neuen Inode den vollständigen Zugriffspfad der originalen Datei. Löscht man nun quelle, existiert ziel2 weiter, zeigt aber ins "Nichts" (auf eine nicht mehr existierende Datei), ist sozusagen unbrauchbar geworden. Der Vorteil symbolischer Links besteht in der Möglichkeit, sie auch über Partitionsgrenzen hinweg anwenden zu können. Ein Beispiel erläutert den Sachverhalt in Abschnitt Links.

Das Umbenennen bzw. Verschieben von Dateien erfolgt mit dem Kommando `mv` - move:

`user@sonne> mv quelle ziel`

Die Datei quelle erhält den neuen Namen ziel, falls ziel nicht existierte oder es sich um eine normale Datei handelt (dann wird der ursprügnliche Inhalt überschrieben). Ist ziel ein Verzeichnis, so wird quelle in dieses verschoben. Mehrere Dateien lassen sich mit `mv` gleichzeitig verschieben. Eine einzelne Datei kann in einem Schritt verschoben und umbenannt werden:

`# Mehrere Dateien verschieben; ziel muss ein Verzeichnis sein user@sonne> mv quelle1 quelle2 quelleN ziel # Datei in ein Verzeichnis munter einem anderen Namen verschieben user@sonne> mv quelle ziel/neuer_name`