Kapitel Dateien aufgeteilt

Michael Schaar 2023-09-22 15:28:28 +02:00
parent 15de623843
commit b4ac7cd4f1
11 changed files with 949 additions and 916 deletions

@ -0,0 +1,38 @@
### Absolute und relative Pfadnamen
__absolute Pfadnamen__
Jede Datei in einem Linux-System wird durch einen Namen beschrieben, der sich ergibt, indem man ausgehend vom Wurzelverzeichnis jedes Verzeichnis nennt bis zu dem, in dem die Datei steht, gefolgt vom Namen der Datei selbst. Beispielsweise benennt `/home/hugo/brief.txt` die Datei `brief.txt`, die im Verzeichnis `hugo` steht, das wiederum im Verzeichnis `home` zu finden ist. Das Verzeichnis `home` steht direkt im `Wurzelverzeichnis`. Solche Namen, die vom Wurzelverzeichnis ausgehen, heißen `absolute Pfadnamen«` (engl. absolute path names) wir sprechen von `Pfadnamen`, weil der Name einen `Pfad` durch den Verzeichnisbaum beschreibt, in dem die Namen von Verzeichnissen und Dateien vorkommen können (es handelt sich also um einen Sammelbegriff).
__aktuelles Verzeichnis und relative Pfadnamen__
Jeder Prozess in einem Linux-System hat ein `aktuelles Verzeichnis` (engl. current directory, auch working directory, »Arbeitsverzeichnis«). Dateinamen werden in diesem Verzeichnis gesucht; brief.txt ist also eine bequeme Abkürzung für »die
Datei brief.txt im aktuellen Verzeichnis«, und susi/brief.txt « steht für »die Datei brief.txt im Verzeichnis susi , das im aktuellen Verzeichnis steht«. Solche Namen, die vom aktuellen Verzeichnis ausgehen, nennen wir »relative Pfadnamen« (engl. relative path names).
__Hinweis__
Sie können ganz einfach absolute von relativen Pfadnamen unterscheiden:
Ein Pfadname, der mit » / « anfängt, ist absolut; alle anderen Pfadnamen sind relativ.
__Hinweis__
Das aktuelle Verzeichnis _vererbt_ sich vom Elterprozess auf den Kindprozess. Wenn Sie also aus einer Shell heraus eine neue Shell (oder ein anderes Programm) starten, dann hat diese neue Shell dasselbe aktuelle Verzeichnis wie die Shell, aus der Sie sie gestartet haben. Sie können innerhalb der neuen Shell mit `cd` in ein anderes Verzeichnis wechseln, aber das aktuelle Verzeichnis der alten Shell ändert sich dadurch nicht wenn Sie die neue Shell verlassen, dann sind Sie wieder im (unveränderten) aktuellen Verzeichnis
der alten Shell.
__Abkürzungen__
In relativen (oder auch absoluten) Pfadnamen gibt es zwei bequeme Abkürzungen: Der Name `..` steht für das dem jeweiligen Verzeichnis im Verzeichnisbaum __übergeordnete__ Verzeichnis im Falle von `/home/hugo` also beispielsweise `/home`. Das erlaubt Ihnen oftmals, bequemer als über absolute Pfadnamen auf Dateien Bezug zu nehmen, die aus der Sicht des aktuellen Verzeichnisses in einem _Seitenast_ des Verzeichnisbaums zu finden sind. Nehmen wir an, `/home/hugo` hätte die Unterverzeichnisse `briefe` und `romane` . Mit `briefe` als aktuellem Verzeichnis könnten Sie sich über den relativen Pfadnamen `../romane/werther.txt` auf die Datei `werther.txt` im Verzeichnis `romane` beziehen, ohne den umständlichen absoluten Namen `/home/hugo/romane/werther.txt` angeben zu müssen.
Die zweite Abkürzung ergibt keinen ganz so offensichtlichen Sinn: Der Name `.` in einem Verzeichnis steht immer für das Verzeichnis selbst. Es leuchtet nicht unmittelbar ein, wofür man eine Methode braucht, auf ein Verzeichnis zu verweisen, in dem man sich bereits befindet, aber es gibt Situationen, wo das sehr nützlich ist. Zum Beispiel wissen Sie vielleicht schon (oder können in Kapitel 8 nachschauen), dass die Shell die Programmdateien für externe Kommandos in den Verzeichnissen sucht, die in der Umgebungsvariablen `PATH` aufgelistet sind. Wenn Sie als Softwareentwickler ein Programm, nennen wir es mal `prog`, aufrufen wollen, das (a) in einer Datei im aktuellen Verzeichnis steht und (b) dieses aktuelle Verzeichnis nicht in `PATH` zu finden ist (aus Sicherheitsgründen immer eine gute Idee), dann können Sie mit
```
./prog
```
die Shell trotzdem dazu bringen, Ihre Datei als Programm zu starten, ohne dass Sie einen absoluten Pfadnamen angeben müssen.
__Hinweise__
Als Linux-Benutzer haben Sie ein `Heimatverzeichnis`, in dem Sie direkt nach dem Anmelden am System landen. Welches das ist, bestimmt der Systemadministrator beim Anlegen Ihres Benutzerkontos, aber es heißt normalerweise so wie Ihr Benutzername und ist unterhalb von `/home` zu finden etwas wie `/home/hugo` für den Benutzer `hugo`.

@ -16,16 +16,15 @@ __Vorkenntnisse__
## Datei- und Pfadnamen
__Welche Besonderheiten haben Dateinamen in einem Linuxsystem?__
### Welche Besonderheiten haben Dateinamen in einem Linuxsystem?
Dateinamen in einem Linuxsystem haben einige Besonderheiten im Vergleich zu anderen Betriebssystemen. Hier sind einige der Merkmale:
[Dateinamen](Dateinamen) in einem Linuxsystem haben einige Besonderheiten im Vergleich zu anderen Betriebssystemen. Hier sind einige der Merkmale:
1. Groß- und Kleinschreibung: Linux-Dateisysteme sind in der Regel case-sensitive, das bedeutet, dass "datei.txt" und "Datei.txt" als zwei verschiedene Dateien betrachtet werden.
2. Erlaubte Zeichen: In Linux-Dateinamen sind die meisten Zeichen erlaubt, außer "/", "\0" (Nullbyte) und "-". Einige spezielle Zeichen sollten jedoch vermieden werden, da sie eine bes
ondere Bedeutung im Dateisystem haben können. Dazu gehören Leerzeichen, Sonderzeichen und reservierte Zeichen wie "*", "?", "|", ":" usw.
2. Erlaubte Zeichen: In Linux-Dateinamen sind die meisten Zeichen erlaubt, außer "/" und "\0" (Nullbyte). Einige spezielle Zeichen sollten jedoch vermieden werden, da sie eine besondere Bedeutung im Dateisystem haben können. Dazu gehören Leerzeichen, Sonderzeichen und reservierte Zeichen wie "*", "?", "|", ":", "-" usw.
3. Länge des Dateinamens: In den meisten Linux-Dateisystemen liegt die maximale Länge eines Dateinamens bei etwa 255 Zeichen. Es kann jedoch von Dateisystem zu Dateisystem variieren.
3. Länge des Dateinamens: In den meisten Linux-Dateisystemen liegt die maximale Länge eines Dateinamens bei etwa 255 Zeichen (bzw. 4096). Es kann jedoch von Dateisystem zu Dateisystem variieren.
4. Verzeichnistrennzeichen: In Linux wird "/" als Trennzeichen für Verzeichnisse verwendet. Ein vollständiger Pfad zu einer Datei würde also so aussehen: "/verzeichnis1/verzeichnis2/date
iname.txt".
@ -38,33 +37,27 @@ iname.txt".
Diese sind nur einige der Besonderheiten von Dateinamen in einem Linuxsystem. Es gibt noch viele weitere, aber diese sind die wichtigsten.
__Welche Besonderheiten haben Verzeichnisse in einem Linuxsystem__
### Welche Besonderheiten haben Verzeichnisse in einem Linuxsystem
Verzeichnisse in einem Linuxsystem haben mehrere Besonderheiten:
[Verzeichnisse](Verzeichnisse) in einem Linuxsystem haben mehrere Besonderheiten:
1. Hierarchische Struktur: Das Dateisystem in Linux ist hierarchisch aufgebaut, wobei das Wurzelverzeichnis (/) das oberste Verzeichnis ist. Alle anderen Verzeichnisse sind Unterverzeichn
isse des Wurzelverzeichnisses und können wiederum weitere Unterverzeichnisse enthalten.
1. Hierarchische Struktur: Das Dateisystem in Linux ist hierarchisch aufgebaut, wobei das Wurzelverzeichnis (/) das oberste Verzeichnis ist. Alle anderen Verzeichnisse sind Unterverzeichnisse des Wurzelverzeichnisses und können wiederum weitere Unterverzeichnisse enthalten.
2. Mount Points: In Linux können verschiedene Laufwerke oder Partitionen in das Dateisystem eingebunden werden. Diese werden als Mount Points bezeichnet und als Verzeichnisse im Dateisystem
dargestellt. Dadurch kann auf die Inhalte der Laufwerke über das entsprechende Verzeichnis zugegriffen werden.
2. Mount Points: In Linux können verschiedene Laufwerke oder Partitionen in das Dateisystem eingebunden werden. Diese werden als Mount Points bezeichnet und als Verzeichnisse im Dateisystem dargestellt. Dadurch kann auf die Inhalte der Laufwerke über das entsprechende Verzeichnis zugegriffen werden.
3. Verzeichnisstrukturkonventionen: In Linux gibt es bestimmte Konventionen für Verzeichnisnamen und deren Verwendung. Zum Beispiel werden Systemdateien und -verzeichnisse in /etc/ oder /
usr/share abgelegt, während Benutzerdateien in /home/username/ zu finden sind.
3. Verzeichnisstrukturkonventionen: In Linux gibt es bestimmte Konventionen für Verzeichnisnamen und deren Verwendung. Zum Beispiel werden Systemdateien und -verzeichnisse in /etc/ oder /usr/share abgelegt, während Benutzerdateien in /home/username/ zu finden sind.
4. Symbolische Links: Linux ermöglicht die Verwendung von symbolischen Links, die auf andere Verzeichnisse oder Dateien verweisen. Diese können verwendet werden, um Verknüpfungen zu erst
ellen oder den Zugriff auf bestimmte Dateien oder Verzeichnisse zu erleichtern.
4. Symbolische Links: Linux ermöglicht die Verwendung von symbolischen Links, die auf andere Verzeichnisse oder Dateien verweisen. Diese können verwendet werden, um Verknüpfungen zu erstellen oder den Zugriff auf bestimmte Dateien oder Verzeichnisse zu erleichtern.
5. Berechtigungen: Verzeichnisse haben eigene Berechtigungen, die steuern, wer auf sie zugreifen, Verzeichnisinhalte anzeigen, Dateien erstellen oder diese bearbeiten kann. Die Berechtig
ungen können für den Besitzer, die Gruppe und andere Benutzer unterschiedlich festgelegt werden.
5. Berechtigungen: Verzeichnisse haben eigene Berechtigungen, die steuern, wer auf sie zugreifen, Verzeichnisinhalte anzeigen, Dateien erstellen oder diese bearbeiten kann. Die Berechtigungen können für den Besitzer, die Gruppe und andere Benutzer unterschiedlich festgelegt werden.
6. Sonderverzeichnisse: Es gibt einige spezielle Verzeichnisse in Linux, die bestimmte Funktionen haben. Dazu gehören das Wurzelverzeichnis (/), das Startverzeichnis (~ oder /home/username/
), das temporäre Verzeichnis (/tmp/) und das aktuelle Verzeichnis (.), um nur einige Beispiele zu nennen.
6. Sonderverzeichnisse: Es gibt einige spezielle Verzeichnisse in Linux, die bestimmte Funktionen haben. Dazu gehören das Wurzelverzeichnis (/), das Startverzeichnis (~ oder /home/username/), das temporäre Verzeichnis (/tmp/) und das aktuelle Verzeichnis (.), um nur einige Beispiele zu nennen.
Diese Besonderheiten machen die Verzeichnisse in einem Linuxsystem vielseitig und ermöglichen eine flexible Organisation und Verwaltung von Dateien und Ordnern.
__Was sind relative und absolute Pfadangaben in Linux__
### Was sind relative und absolute Pfadangaben in Linux
In Linux beziehen sich relative und absolute Pfadangaben darauf, wie der Datei- oder Verzeichnisstandort in Bezug auf das aktuelle Arbeitsverzeichnis angegeben wird.
In Linux beziehen sich [relative und absolute Pfadangaben](Absolute_und_relative_Pfadnamen) darauf, wie der Datei- oder Verzeichnisstandort in Bezug auf das aktuelle Arbeitsverzeichnis angegeben wird.
- Absolute Pfadangaben beginnen immer mit einem Schrägstrich (/) und geben den vollständigen Pfad vom Root-Verzeichnis aus an. Zum Beispiel: /home/benutzer/dokumente/text.txt.
- Relative Pfadangaben geben den Pfad relativ zum aktuellen Arbeitsverzeichnis an. Zum Beispiel: wenn sich das aktuelle Verzeichnis in /home/benutzer befindet und das Zielverzeichnis
@ -73,7 +66,7 @@ In Linux beziehen sich relative und absolute Pfadangaben darauf, wie der Datei-
Um absolute oder relative Pfadangaben zu verwenden, kann der Befehl "cd" (Change Directory) verwendet werden, um das aktuelle Arbeitsverzeichnis zu ändern, und der Befehl "ls" (List
Directory Contents), um Dateien und Verzeichnisse in einem bestimmten Pfad anzuzeigen.
__Nenne die wichtigsten Linux Kommandos für Daeinamen und Verzeichnisse__
## Nenne die wichtigsten Linux Kommandos für Dateinamen und Verzeichnisse
- ls: Zeigt den Inhalt eines Verzeichnisses an
- cd: Wechselt das aktuelle Verzeichnis
@ -95,899 +88,6 @@ __Nenne die wichtigsten Linux Kommandos für Daeinamen und Verzeichnisse__
- head: Zeigt die ersten Zeilen einer Datei an
- tail: Zeigt die letzten Zeilen einer Datei an
### Dateinamen
Eine der wesentlichen Dienste eines Betriebssystems wie Linux besteht darin, Daten auf dauerhaften Speichermedien wie Festplatten oder USB-Sticks speichern und später wiederfinden zu können. Um das für Menschen erträglich zu gestalten, werden zusammengehörende Daten normalerweise zu `Dateien` zusammengefasst, die auf dem Speichermedium unter einem Namen gespeichert werden.
__Hinweis__
Auch wenn Ihnen das trivial vorkommen mag: Selbstverständlich ist das nicht. Betriebssysteme in früheren Zeiten machten es mitunter nötig, dass man Gräuel wie die passenden Spurnummern auf Platten kennen musste, wenn man seine Daten wieder finden wollte.
__Erlaubte Zeichen__
Bevor wir Ihnen erklären können, wie Sie mit Dateien umgehen, müssen wir Ihnen also erklären, wie Linux Dateien benennt.
In Linux-Dateinamen sind grundsätzlich __alle Zeichen__ zugelassen, die der Computer darstellen kann (und noch ein paar mehr). Da einige dieser Zeichen aber eine besondere Bedeutung haben, raten wir von deren Verwendung in Dateinamen aber ab. __Komplett verboten__ innerhalb von Dateinamen sind nur __zwei Zeichen__, der __Schrägstrich__ und das __Nullbyte__ (das Zeichen mit dem ASCII-Wert 0). Andere Zeichen wie _Leerzeichen_, _Umlaute_ oder _Dollarzeichen_ können verwendet werden, müssen dann aber auf der Kommandozeile meist durch einen _Rückstrich oder Anführungszeichen maskiert_ werden, um Fehlinterpretationen durch die Shell zu vermeiden.
__Achtung: Groß- und Kleinschreibung__
Eine Stolperfalle für Umsteiger ist, dass Linux in Dateinamen zwischen Groß- und Kleinschreibung unterscheidet. Im Gegensatz zu Windows, wo Groß- und Kleinbuchstaben in Dateinamen zwar dargestellt, aber identisch behandelt werden, interpretiert Linux x- files und X- Files tatsächlich als zwei verschiedene Dateinamen.
Dateinamen dürfen unter Linux _ziemlich lang_ sein eine feste allgemeinverbindliche Grenze gibt es nicht, da das __Maximum__ vom __Dateisystem__ abhängt, also der Methode, wie genau die Bytes auf der Platte arrangiert sind (davon gibt es unter Linux mehrere). Eine typische Obergrenze sind aber 255 Zeichen und da so ein Name auf einem normalen Textterminal gut drei Zeilen einnehmen würde,
sollte das Ihren Stil nicht übermäßig einschränken.
__Endungen__
Eine weitere Abweichung zu DOS- bzw. Windows-Rechnern besteht darin, Endungen dass bei Linux Dateien nicht durch entsprechende Endungen charakterisiert werden __müssen__. _Der Punkt ist in einem Dateinamen also ein ganz gewöhnliches Zeichen_. Ein Text kann daher als `blabla.txt` abgespeichert werden, aber einfach `blabla` wäre grundsätzlich ebenso zulässig. Was nicht heißt, dass Sie keine _Dateiendungen_ benutzen sollten immerhin erleichtern solche Kennzeichnungen die Identifizierung des Dateiinhaltes.
__Hinweis__
Manche Programme bestehen darauf, dass ihre Eingabedateien bestimmte Endungen haben. Der C-Übersetzer `gcc` zum Beispiel betrachtet Dateien mit Namen, die auf `.c` enden, als C-Quelltext, solche mit Namen auf `.s` als Assemblerquelltext und solche mit Namen auf `.o` als vorübersetzte Objektdateien.
__Sonderzeichen__
Umlaute und andere Sonderzeichen können Sie in Dateinamen grundsätzlich ungeniert verwenden. Sollen aber Dateien gleichermaßen auf anderen Systemen benutzt werden, ist es besser, auf Sonderzeichen in Dateinamen zu verzichten, da nicht garantiert ist, dass sie auf anderen Systemen als dieselben Zeichen erscheinen.
__Ortseinstellung__
Was mit Sonderzeichen passiert, hängt auch von der Ortseinstellung ab, da es keinen allgemein üblichen Standard dafür gibt, Zeichen darzustellen, die den Zeichenvorrat des ASCII (128 Zeichen, die im wesentlichen die englische Sprache, Ziffern und die gängigsten Sonderzeichen abdecken) überschreiten. In weitem Gebrauch sind zum Beispiel die Zeichentabellen `ISO 8859-1` und `ISO 8859-15` (vulgo `ISO-Latin-1` und `ISO-Latin-9` ... fragen Sie nicht) sowie `ISO 10646`, gerne salopp und nicht ganz korrekt als `Unicode` bezeichnet und in der Regel als `UTF-8` codiert. Dateinamen mit Sonderzeichen, die Sie anlegen, während Zeichentabelle X aktiv ist, können völlig anders aussehen, wenn Sie sich das Verzeichnis gemäß Zeichentabelle Y anschauen. Das ganze Thema ist nichts, worüber man beim Essen nachdenken möchte.
__`convmv`__
Sollten Sie jemals in die Verlegenheit kommen, einen Berg Dateien vor sich zu haben, deren Namen allesamt gemäß einer verkehrten Zeichentabelle codiert sind, kann Ihnen vielleicht das Programm `convmv` helfen, das Dateinamen zwischen verschiedenen Zeichentabellen konvertieren kann. (Sie werden es vermutlich selber installieren müssen, da es sich normalerweise nicht im Standardumfang gängiger Distributionen befindet.) Allerdings sollten Sie sich damit erst befassen, wenn Sie den Rest dieses Kapitels durchgearbeitet haben, denn wir haben Ihnen noch nicht einmal das reguläre `mv` erklärt ...
__Portable Dateinamen__
Ohne Bedenken lassen sich alle Zeichen aus
```
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789+-._
```
in Dateinamen benutzen. Allerdings sollten Sie die folgenden Tipps berücksichtigen:
* Um den Datenaustausch mit älteren Unix-Systemen zu ermöglichen, sollte die Länge eines Dateinamens gegebenenfalls maximal 14 Zeichen betragen.
* Dateinamen sollten stets mit einem der genannten Buchstaben oder einer Ziffer beginnen, die vier anderen Zeichen sind nur innerhalb eines Dateinamens problemlos verwendbar.
Diese Konventionen lassen sich am leichtesten mit ein paar Beispielen verstehen. Zulässige Dateinamen wären etwa:
```
X-files
bla.txt.bak
17.Juni
7_of_9
```
Schwierigkeiten wären dagegen möglich (wenn nicht gar wahrscheinlich oder sogar sicher) mit:
```
-20°C Beginnt mit » - «, Sonderzeichen
.profile Wird versteckt
3/4-Takt Enthält verbotenes Zeichen
Müll Enthält Umlaut
```
__Versteckte Dateien__
Als weitere Besonderheit werden Dateinamen, die mit einem Punkt (`.`) anfangen, an einigen Stellen (etwa beim Auflisten von Verzeichnisinhalten) übersprungen Dateien mit solchen Namen gelten als »versteckt«. Diese Eigenschaft verwendet man unter anderem gerne für Dateien, die Voreinstellungen für Programme enthalten und die in Dateinamenslisten nicht von wichtigeren Dateien
ablenken sollen.
__Hinweis__
Für DOS- und Windows-Experten: Diese Systeme erlauben »versteckte« Dateien über ein unabhängig vom Namen zu setzendes »Dateiattribut«. Unter Linux bzw. Unix gibt es so etwas nicht.
### Verzeichnisse
Da auf demselben Linux-System potentiell viele Benutzer arbeiten können, wäre es ein Problem, wenn es jeden Dateinamen nur einmal geben dürfte. Dem Benutzer `Hugo` wäre wohl nur schwer klar zu machen, dass er keine Datei namens `brief.txt` anlegen kann, weil die Benutzerin `Susi` schon eine Datei hat, die so heißt. Außerdem muss irgendwie (bequem) geregelt werden können, dass `Hugo` nicht
alle Dateien von `Susi` lesen kann und umgekehrt.
Aus diesem Grund unterstützt Linux das Konzept __hierarchischer Verzeichnisse__, die zum Gruppieren von Dateien dienen. Dateinamen müssen nicht über das __ganze System__ hinweg __eindeutig__ sein, sondern nur im __selben Verzeichnis__. Das bedeutet insbesondere, dass `Hugo` und `Susi` vom System verschiedene Verzeichnisse zugeordnet bekommen können und darin dann jeweils ihre Dateien so nennen
dürfen, wie sie mögen, ohne aufeinander Rücksicht nehmen zu müssen. Ferner kann man `Hugo` den Zugriff auf `Susis` Verzeichnis verbieten (und umgekehrt) und muss sich dann nicht mehr um die einzelnen Dateien kümmern, die dort jeweils stehen.
__Schrägstrich__
Verzeichnisse sind bei Linux auch nur Dateien, wenn auch Dateien, die Sie nicht mit denselben Mitteln bearbeiten können wie _gewöhnliche_ Dateien. Das bedeutet aber, dass für die Namen von Verzeichnissen dieselben Regeln gelten wie für die Namen von Dateien (siehe voriger Abschnitt). Sie müssen nur noch lernen, dass der Schrägstrich (`/`) dazu dient, Dateinamen von Verzeichnisnamen und Verzeichnisnamen voneinander zu trennen. `hugo/brief.txt` wäre also die Datei `brief.txt` im Verzeichnis `hugo`.
__Verzeichnisbaum__
Verzeichnisse können andere Verzeichnisse enthalten (das ist das _hierarchisch_ von weiter vorne), wodurch sich eine baumartige Struktur ergibt (naheliegenderweise gerne `Verzeichnisbaum` genannt). Ein Linux-System hat ein spezielles Verzeichnis, das die Wurzel des Baums bildet und deswegen `Wurzelverzeichnis` oder neudeutsch `root directory` genannt wird. Es hat nach Konvention den Namen `/` (Schrägstrich).
__Hinweis__
Trotz seiner englischen Bezeichnung hat das Wurzelverzeichnis __nichts mit dem Systemverwalter root zu tun__. Die beiden heißen einfach nur so ähnlich.
__Hinweis__
Der Schrägstrich spielt hier eine Doppelrolle er dient sowohl als Name des Wurzelverzeichnisses als auch als Trennzeichen zwischen anderen Verzeichnissen. Hierzu gleich mehr.
Die Grundinstallation gängiger Linux-Distributionen enthält normalerweise Zehntausende von Dateien in einer größtenteils durch gewisse Konventionen vorstrukturierten Verzeichnishierarchie. Über diese Verzeichnishierarchie erfahren Sie mehr in Kapitel 9
### Absolute und relative Pfadnamen
__absolute Pfadnamen__
Jede Datei in einem Linux-System wird durch einen Namen beschrieben, der sich ergibt, indem man ausgehend vom Wurzelverzeichnis jedes Verzeichnis nennt bis zu dem, in dem die Datei steht, gefolgt vom Namen der Datei selbst. Beispielsweise benennt `/home/hugo/brief.txt` die Datei `brief.txt`, die im Verzeichnis `hugo` steht, das wiederum im Verzeichnis `home` zu finden ist. Das Verzeichnis `home` steht direkt im `Wurzelverzeichnis`. Solche Namen, die vom Wurzelverzeichnis ausgehen, heißen `absolute Pfadnamen«` (engl. absolute path names) wir sprechen von `Pfadnamen`, weil der Name einen `Pfad` durch den Verzeichnisbaum beschreibt, in dem die Namen von Verzeichnissen und Dateien vorkommen können (es handelt sich also um einen Sammelbegriff).
__aktuelles Verzeichnis und relative Pfadnamen__
Jeder Prozess in einem Linux-System hat ein `aktuelles Verzeichnis` (engl. current directory, auch working directory, »Arbeitsverzeichnis«). Dateinamen werden in diesem Verzeichnis gesucht; brief.txt ist also eine bequeme Abkürzung für »die
Datei brief.txt im aktuellen Verzeichnis«, und susi/brief.txt « steht für »die Datei brief.txt im Verzeichnis susi , das im aktuellen Verzeichnis steht«. Solche Namen, die vom aktuellen Verzeichnis ausgehen, nennen wir »relative Pfadnamen« (engl. relative path names).
__Hinweis__
Sie können ganz einfach absolute von relativen Pfadnamen unterscheiden:
Ein Pfadname, der mit » / « anfängt, ist absolut; alle anderen Pfadnamen sind relativ.
__Hinweis__
Das aktuelle Verzeichnis _vererbt_ sich vom Elterprozess auf den Kindprozess. Wenn Sie also aus einer Shell heraus eine neue Shell (oder ein anderes Programm) starten, dann hat diese neue Shell dasselbe aktuelle Verzeichnis wie die Shell, aus der Sie sie gestartet haben. Sie können innerhalb der neuen Shell mit `cd` in ein anderes Verzeichnis wechseln, aber das aktuelle Verzeichnis der alten Shell ändert sich dadurch nicht wenn Sie die neue Shell verlassen, dann sind Sie wieder im (unveränderten) aktuellen Verzeichnis
der alten Shell.
__Abkürzungen__
In relativen (oder auch absoluten) Pfadnamen gibt es zwei bequeme Abkürzungen: Der Name `..` steht für das dem jeweiligen Verzeichnis im Verzeichnisbaum __übergeordnete__ Verzeichnis im Falle von `/home/hugo` also beispielsweise `/home`. Das erlaubt Ihnen oftmals, bequemer als über absolute Pfadnamen auf Dateien Bezug zu nehmen, die aus der Sicht des aktuellen Verzeichnisses in einem _Seitenast_ des Verzeichnisbaums zu finden sind. Nehmen wir an, `/home/hugo` hätte die Unterverzeichnisse `briefe` und `romane` . Mit `briefe` als aktuellem Verzeichnis könnten Sie sich über den relativen Pfadnamen `../romane/werther.txt` auf die Datei `werther.txt` im Verzeichnis `romane` beziehen, ohne den umständlichen absoluten Namen `/home/hugo/romane/werther.txt` angeben zu müssen.
Die zweite Abkürzung ergibt keinen ganz so offensichtlichen Sinn: Der Name `.` in einem Verzeichnis steht immer für das Verzeichnis selbst. Es leuchtet nicht unmittelbar ein, wofür man eine Methode braucht, auf ein Verzeichnis zu verweisen, in dem man sich bereits befindet, aber es gibt Situationen, wo das sehr nützlich ist. Zum Beispiel wissen Sie vielleicht schon (oder können in Kapitel 8 nachschauen), dass die Shell die Programmdateien für externe Kommandos in den Verzeichnissen sucht, die in der Umgebungsvariablen `PATH` aufgelistet sind. Wenn Sie als Softwareentwickler ein Programm, nennen wir es mal `prog`, aufrufen wollen, das (a) in einer Datei im aktuellen Verzeichnis steht und (b) dieses aktuelle Verzeichnis nicht in `PATH` zu finden ist (aus Sicherheitsgründen immer eine gute Idee), dann können Sie mit
```
./prog
```
die Shell trotzdem dazu bringen, Ihre Datei als Programm zu starten, ohne dass Sie einen absoluten Pfadnamen angeben müssen.
__Hinweise__
Als Linux-Benutzer haben Sie ein `Heimatverzeichnis`, in dem Sie direkt nach dem Anmelden am System landen. Welches das ist, bestimmt der Systemadministrator beim Anlegen Ihres Benutzerkontos, aber es heißt normalerweise so wie Ihr Benutzername und ist unterhalb von `/home` zu finden etwas wie `/home/hugo` für den Benutzer `hugo`.
## Kommandos für Verzeichnisse
### Das aktuelle Verzeichnis: cd & Co.
1. Wir gehen in unser `Benutzerverzeichnis` `~`.
2. Wechseln ins Verzeichenis `data` und
3. falls das Verzeichnis `briefe` existiert, wird dieses gelöscht. Sie können ganz einfach absolute von relativen Pfadnamen unterscheiden:
Ein Pfadname, der mit `/` anfängt, ist absolut; alle anderen Pfadnamen sind
relativ.
```bash
cd
cd data
pwd
if [ -d briefe ]; then rm -rf briefe; fi;
ls -l
```
/home/vagrant/data
insgesamt 16
-rw-rw-r-- 1 vagrant vagrant 0 Mär 21 2020 datei.txt
drwxrwxr-x 2 vagrant vagrant 4096 Mär 21 2020 geschweifte
drwxrwxr-x 3 vagrant vagrant 4096 Mär 21 2020 kopieren
drwxrwxr-x 2 vagrant vagrant 4096 Mär 21 2020 regulaere_Ausdruecke_-_Filter
drwxrwxr-x 2 vagrant vagrant 4096 Mär 21 2020 suchmuster
Wenn Sie `cd` keinen Parameter angeben, landen Sie in Ihrem Heimatverzeichnis.
Erstellen von Verzeichnissen und hineinwechseln
```bash
mkdir briefe
```
```bash
ls -ld briefe
```
drwxr-xr-x 2 vagrant vagrant 4096 Dez 22 10:44 briefe
```bash
cd briefe
```
__Aktuellen Verzeichnisnamen ausgeben__
Mit dem Kommando `pwd` (engl. print working directory) können Sie, wie im Beispiel zu sehen, den absoluten Pfadnamen des aktuellen Verzeichnisses ausgeben.
```bash
pwd
```
/home/vagrant/data/briefe
Dabei ist `~/briefe` eine Abkürzung für `/home/hugo/briefe`; die Tilde (`~`) steht für das Heimatverzeichnis des aktuellen Benutzers.
Übergeordnetes Verzeichnis
```bash
cd ..
pwd
```
/home/vagrant/data
Zurück ins Homeverzeichnis
```bash
cd
pwd
```
/home/vagrant
__Zurück ins vorheriges Verzeichnis__
Das Kommando `cd -` wechselt in das Verzeichnis, das vor dem letzten `cd`-Kommando aktuell war. Damit können Sie bequem zwischen zwei Verzeichnissen hin und her wechseln.
```bash
cd -
```
/home/vagrant/data
```bash
cd /var/www
```
```bash
pwd
```
/var/www
```bash
ls -l
```
insgesamt 4
drwxr-xr-x 3 root root 4096 Sep 11 22:56 html
```bash
cd html
```
```bash
pwd
```
/var/www/html
```bash
cd
```
```bash
pwd
```
/home/vagrant
```bash
cd -
```
/var/www/html
__Übungen__
* C 6.1 [2] Ist `cd` ein externes Kommando oder als internes Kommando in die Shell eingebaut? Warum?
* C 6.2 [3] Lesen Sie in der Handbuchseite der `bash` über die Kommandos `pushd`, `popd` und `dirs` nach. Überzeugen Sie sich, dass diese Kommandos funktionieren.
C 6.1 [2] Ist cd ein externes Kommando oder als internes Kommando in die Shell eingebaut? Warum?
### Dateien und Verzeichnisse auflisten ls
| Dateityp | Farbe | Zeichen ( ls -F ) | Kennung ( ls -l ) |
|----------|-------|-------------------|-------------------|
|gewöhnliche Datei|schwarz| keins | - |
|ausführbare Datei|grün| * | - |
|Verzeichnis|blau | / | d |
|Link |cyan | @ | l |
```bash
cd
cd data/briefe
touch datei.txt datei2.txt
```
```bash
ls -l
```
insgesamt 0
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 10:59 datei2.txt
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 10:59 datei.txt
## Übungen
C 6.1 [2] Ist cd ein externes Kommando oder als internes Kommando in die Shell eingebaut? Warum?
C 6.2 [3] Lesen Sie in der Handbuchseite der bash über die Kommandos pushd,
popd und dirs nach. Überzeugen Sie sich, dass diese Kommandos funktionieren.
### Dateien und Verzeichnisse auflisten ls
```bash
ls
```
datei2.txt datei.txt
```bash
ls -l
```
insgesamt 0
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 10:59 datei2.txt
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 10:59 datei.txt
## Übungen
* C 6.3 [1] Welche Dateien stehen im Verzeichnis /boot ? Hat das Verzeichnis Unerverzeichnisse und, wenn ja, welche?
* C 6.4 [2] Erklären Sie den Unterschied zwischen ls mit einem Dateinamen als Argument und ls mit einem Verzeichnisnamen als Argument.
* C 6.5 [2] Wie können Sie ls dazu bringen, bei einem Verzeichnisnamen als Argument Informationen über das benannte Verzeichnis selbst anstatt über die darin enthaltenen Dateien zu liefern?
### Verzeichnisse anlegen und löschen: mkdir und rmdir
```bash
cd ~/data
if [ -d bilder ]; then rm -rf bilder; fi;
#ohne if
# rm -rf bilder
```
```bash
mkdir bilder/urlaub
```
mkdir: das Verzeichnis »bilder/urlaub“ kann nicht angelegt werden: Datei oder Verzeichnis nicht gefunden
```bash
mkdir --parent bilder/urlaub
```
```bash
cd bilder
ls -F
```
murlaub
```bash
cd ~/data
rmdir bilder/urlaub
ls -F
```
bilder datei.txt kopieren/ suchmuster/
briefe/ geschweifte/ regulaere_Ausdruecke_-_Filter/
```bash
mkdir -p bilder/urlaub/sommer
rmdir bilder/urlaub/sommer
ls -F bilder
```
urlaub/
```bash
rmdir -p bilder/urlaub
ls -F bilder
```
ls: Zugriff auf 'bilder' nicht möglich: Datei oder Verzeichnis nicht gefunden
## Übungen
* C 6.6 [!2] Legen Sie in Ihrem Heimatverzeichnis ein Verzeichnis `grd1-test` mit den Unterverzeichnissen `dir1`, `dir2` und `dir3` an. Wechseln Sie ins Verzeichnis `grd1-test/dir1` und legen Sie (etwa mit einem Texteditor) eine Datei namens hallo mit dem Inhalt _hallo_ an. Legen Sie in `grd1-test/dir2` eine Datei namens `huhu` mit dem Inhalt _huhu_ an. Vergewissern Sie sich, dass diese Dateien angelegt wurden. Löschen Sie das Unterverzeichnis `dir3` mit `rmdir`.
Versuchen Sie anschließend, das Unterverzeichnis `dir2` mit `rmdir` zu löschen.
Was passiert und warum?
## Suchmuster für Dateien
```bash
cd ~/data
ls suchmuster
```
a1.txt c1.txt p22.dat p-.c prog1.c prog-.c rot.txt
a2.txt c2.txt p22.txt p..c prog2.c prog.c untitled.txt
a3.txt c3.txt p2.c p.c prog3.c prog:.c
b1.txt gelb.txt p3.c pop-rock.c prog4.c prog_.c
b2.txt p1.c p4.c prog prog5.c progQ.c
b3.txt p1.txt pa.c prog12.c progabc.c progx.c
blau.txt p21.txt paulchen.c prog13.c prog+.c p.txt
```bash
ls suchmuster/p*.c
```
suchmuster/p1.c suchmuster/pop-rock.c suchmuster/prog+.c
suchmuster/p2.c suchmuster/prog12.c suchmuster/prog-.c
suchmuster/p3.c suchmuster/prog13.c suchmuster/prog.c
suchmuster/p4.c suchmuster/prog1.c suchmuster/prog:.c
suchmuster/pa.c suchmuster/prog2.c suchmuster/prog_.c
suchmuster/paulchen.c suchmuster/prog3.c suchmuster/progQ.c
suchmuster/p-.c suchmuster/prog4.c suchmuster/progx.c
suchmuster/p..c suchmuster/prog5.c
suchmuster/p.c suchmuster/progabc.c
```bash
ls suchmuster/p?.c
```
suchmuster/p1.c suchmuster/p3.c suchmuster/pa.c suchmuster/p..c
suchmuster/p2.c suchmuster/p4.c suchmuster/p-.c
```bash
ls suchmuster/prog[123].c
```
suchmuster/prog1.c suchmuster/prog2.c suchmuster/prog3.c
```bash
ls suchmuster/prog[1-9].c
```
suchmuster/prog1.c suchmuster/prog3.c suchmuster/prog5.c
suchmuster/prog2.c suchmuster/prog4.c
Achtung dies funktioniert anders als im Buch
```bash
ls suchmuster/prog[A-z].c
```
suchmuster/prog_.c suchmuster/progQ.c suchmuster/progx.c
```bash
ls suchmuster/prog[!A-z].c
```
suchmuster/prog1.c suchmuster/prog3.c suchmuster/prog5.c suchmuster/prog-.c
suchmuster/prog2.c suchmuster/prog4.c suchmuster/prog+.c suchmuster/prog:.c
### Geschweifte Klammern
```bash
cd ~/data
if [ -d geschweifte ]; then rm -rf geschweifte; fi;
```
```bash
mkdir geschweifte
ls -d geschweifte
cd geschweifte
```
geschweifte
```bash
touch {rot,blau,gelb}.txt
ls -l *.txt
```
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:22 blau.txt
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:22 gelb.txt
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:22 rot.txt
```bash
touch {a,b,c}{1,2,3}.dat
ls -l *.dat
```
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 a1.dat
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 a2.dat
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 a3.dat
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 b1.dat
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 b2.dat
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 b3.dat
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 c1.dat
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 c2.dat
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 c3.dat
```bash
mkdir -p umsatz/201{6,7}/q{1,2,3,4}
tree umsatz
```
umsatz
├── 2016
│   ├── q1
│   ├── q2
│   ├── q3
│   └── q4
└── 2017
├── q1
├── q2
├── q3
└── q4
10 directories, 0 files
## Übungen
* C 6.7 [!1] Im aktuellen Verzeichnis stehen die Dateien
* prog.c
* p.txt
* prog1.c
* p1.txt
* prog2.c
* p21.txt
* progabc.c
* p22.txt
* prog
* p22.dat
Auf welche dieser Dateinamen passen die Suchmuster
(a) prog*.c,
(b) prog?.c,
(c) p?*.txt,
(d) p[12]*,
(e) p*,
(f) *.*
* C 6.8 [!2] Was ist der Unterschied zwischen » ls « und » ls * «? (Tipp: Probieren Sie beides in einem Verzeichnis aus, das Unterverzeichnisse enthält.)
* C 6.9 [2] Erklären Sie, warum das folgende Kommando zur angezeigten Ausgabe führt:
$ ls
-l datei1 datei2 datei3
$ ls *
-rw-r--r-- 1 hugo users 0 Dec 19 11:24 datei1
-rw-r--r-- 1 hugo users 0 Dec 19 11:24 datei2
-rw-r--r-- 1 hugo users 0 Dec 19 11:24 datei3
* C 6.10 [2] Warum ist es sinnvoll, dass » * « nicht auf Dateinamen mit Punkt am Anfang passt?
### Kopieren, Verschieben und Löschen cp und Verwandte
```bash
cd ~/data
if [ -d kopieren ]; then rm -rf kopieren; fi;
mkdir kopieren
ls -lisa >> kopieren/liste
cd kopieren
```
```bash
md5sum liste
```
```bash
cp liste liste2
md5sum liste2
```
```bash
ls -l /etc/passwd
md5sum /etc/passwd
cp /etc/passwd .
ls -l
md5sum passwd
```
```bash
mv passwd liste2
ls -l
md5sum *
```
```bash
rm lis*
```
```bash
ls -l
```
## Übungen
* C 6.11 [!2] Legen Sie in Ihrem Heimatverzeichnis eine Kopie der Datei /etc/services unter dem Namen myservices an. Benennen Sie sie um in srv.dat und kopieren Sie sie unter demselben Namen ins Verzeichnis /tmp. Löschen Sie anschließend beide Kopien der Datei.
* C 6.12 [1] Warum hat mv keine -R -Option wie cp?
* C 6.13 [!2] Angenommen, in einem Ihrer Verzeichnisse steht eine Datei namens »- file« (mit einem Minuszeichen am Anfang des Namens). Wie würden Sie diese Datei entfernen?
* C 6.14 [2] Wenn Sie ein Verzeichnis haben, in dem Sie nicht versehentlich einem »rm *« zum Opfer fallen wollen, können Sie dort eine Datei namens »- i« anlegen, etwa mit $ > -i (wird in Kapitel 7 genauer erklärt). Was passiert, wenn Sie jetzt das Kommando » rm * « ausführen, und warum?
## Dateien verknüpfen ln und ln -s
Eine harte Verknüpfung in einem "shared Folder" geht nicht. Daher im Ornder /tmp
```bash
cd /tmp
if [ -d links ]; then rm -rf links; fi;
mkdir links
ls -lisa >> links/liste
cd links
```
```bash
ln liste liste2
ls -li
```
```bash
rm liste
ls -li
```
```bash
cd /tmp
cp -r ~/data/suchmuster .
```
```bash
mkdir suchmuster2
cp -l suchmuster/* suchmuster2
```
```bash
ls -li suchmuster*
```
```bash
ln -s /var/log kurz
ls -l
```
```bash
cd kurz
pwd
```
```bash
pwd -P
```
```bash
cd /tmp
ls kurz
```
```bash
ls -l kurz
```
```bash
ls -ld kurz
```
```bash
rm kurz
ls -l
```
```bash
mkdir dir
echo XXXXXXXXX > dir/datei
ln -s datei dir/symlink
ls -l dir
```
```bash
ls -lL dir
```
```bash
ls -lH dir
```
```bash
ls -l dir/symlink
```
```bash
ls -lH dir/symlink
```
## Übungen
* C 6.15 [!2] Erzeugen Sie eine Datei mit beliebigem Inhalt in Ihrem Heimatverzeichnis (etwa mit » echo Hallo >~/hallo « oder einem Texteditor). Legen Sie unter dem Namen link ein hartes Link auf die Datei an. Überzeugen Sie sich, dass nun zwei Namen für die Datei existieren. Versuchen Sie den Dateiinhalt mit einem Editor zu ändern. Was passiert?
* C 6.16 [!2] Legen Sie unter dem Namen ~/symlink ein symbolisches Link auf die Datei aus der vorigen Aufgabe an. Prüfen Sie, ob der Zugriff funktioniert. Was passiert, wenn Sie die Zieldatei des Links löschen?
* C 6.17 [!2] Auf welches Verzeichnis zeigt das ..-Link im Verzeichnis »/«?
* C 6.18 [3] Betrachten Sie das folgende Kommando und seine Ausgabe:
$ ls -ai /
2 . 330211 etc 1 proc 4303 var
2 .. 2 home 65153 root
4833 bin 244322 lib 313777 sbin
228033 boot 460935 mnt 244321 tmp
330625 dev 460940 opt 390938 usr
Offensichtlich haben die Verzeichnisse / und /home dieselbe Inodenummer. Da es sich dabei offensichtlich nicht wirklich um dasselbe Verzeichnis handeln kann können Sie dieses Phänomen erklären?
* C 6.19 [2] Betrachten Sie die Inode-Nummern der Links » . « und » .. « im Wurzelverzeichnis ( / ) und in einigen beliebigen anderen Verzeichnissen. Was fällt Ihnen auf?
* C 6.20 [3] Wir haben gesagt, dass harte Links auf Verzeichnisse nicht erlaubt sind. Welchen Grund könnte es dafür geben?
* C 6.21 [3] Woran erkennt man in der Ausgabe von » ls -l ~ «, dass ein Unterverzeichnis von ~ keine weiteren Unterverzeichnisse hat?
* C 6.22 [2] Wie verhalten sich » ls -lH « und » ls -lL «, wenn ein symbolisches Link auf ein anderes symbolisches Link zeigt?
### Dateien suchen - find
```bash
cd
sudo touch root_was_here
ls -l
find . -user root -print
```
```bash
find . -user root -exec ls -l '{}' \;
```
Testkriterien von find in Tabelle 6.6 S. 88
```bash
find . -atime +2 -exec ls -l '{}' \;
```
## Übungen
* C 6.25 [!2] Finden Sie alle Dateien in Ihrem System, die größer als 1 MiB sind, und lassen Sie deren Namen ausgeben.
* C 6.26 [2] Wie können Sie find benutzen, um eine Datei zu löschen, die einen merkwürdigen Namen hat (etwa mit unsichtbaren Kontrollzeichen oder mit Umlauten, die von älteren Shells nicht verstanden werden)?
* C 6.27 [3] (Beim zweiten Durcharbeiten.) Wie würden Sie beim Abmelden dafür sorgen, dass etwaige Dateien in /tmp , die Ihnen gehören, automatisch gelöscht werden?
### Datei schnell finden - locate un slocate
```bash
locate prog
```
```bash
sudo apt update && sudo apt install --yes mlocate
```
```bash
locate prog
```
```bash
sudo updatedb
```
```bash
locate prog
```
```bash
locate "*/prog*.c"
```
## Übungen
* C 6.28 [!1] README ist ein sehr populärer Dateiname. Geben Sie die absoluten Pfadnamen aller Dateien auf Ihrem System an, die README heißen.
* C 6.29 [2] Legen Sie eine neue Datei in Ihrem Heimatverzeichnis an und überzeugen Sie sich durch einen locate -Aufruf, dass diese Datei nicht gefunden wird (wählen Sie gegebenenfalls einen hinreichend ausgefallenen Dateinamen). Rufen Sie dann (mit Administratorrechten) das Programm updatedb auf. Wird Ihre neue Datei danach mit locate gefunden? Löschen Sie die Datei wieder und wiederholen Sie die vorigen Schritte.
* C 6.30 [1] Überzeugen Sie sich, dass slocate funktioniert, indem Sie als gewöhnlicher Benutzer nach Dateien wie /etc/shadow suchen.
## Kommandos in diesem Kapitel
@ -1027,7 +127,7 @@ xargs Konstruiert Kommandozeilen aus seiner Standardeingabe xargs (1), Info: f
* Die Kommandos `cp`, `mv` und `rm` kopieren, verschieben und löschen Dateien und Verzeichnisse.
* Mit `ln` können Sie »harte« und »symbolische« Links anlegen.
* Mit `ln` können Sie ["harte" und "symbolische" Links anlegen](Dateien_verknüpfen).
* `more` und `less` dienen zum seitenweisen Anzeigen von Dateien auf dem Terminal.

205
Dateien_verknüpfen.md Normal file

@ -0,0 +1,205 @@
## Dateien verknüpfen ln und ln -s
Eine harte Verknüpfung in einem "shared Folder" geht nicht. Daher im Ornder /tmp
```bash
cd /tmp
if [ -d links ]; then rm -rf links; fi;
mkdir links
ls -lisa >> links/liste
cd links
```
```bash
ln liste liste2
ls -li
```
```bash
rm liste
ls -li
```
```bash
cd /tmp
cp -r ~/dateien/suchmuster .
```
```bash
mkdir suchmuster2
cp -l suchmuster/* suchmuster2
```
```bash
ls -li suchmuster*
```
```bash
ln -s /var/log kurz
ls -l
```
```bash
cd kurz
pwd
```
```bash
pwd -P
```
```bash
cd /tmp
ls kurz
```
```bash
ls -l kurz
```
```bash
ls -ld kurz
```
```bash
rm kurz
ls -l
```
```bash
mkdir dir
echo XXXXXXXXX > dir/datei
ln -s datei dir/symlink
ls -l dir
```
```bash
ls -lL dir
```
```bash
ls -lH dir
```
```bash
ls -l dir/symlink
```
```bash
ls -lH dir/symlink
```
## Übungen
* C 6.15 [!2] Erzeugen Sie eine Datei mit beliebigem Inhalt in Ihrem Heimatverzeichnis (etwa mit » echo Hallo >~/hallo « oder einem Texteditor). Legen Sie unter dem Namen link ein hartes Link auf die Datei an. Überzeugen Sie sich, dass nun zwei Namen für die Datei existieren. Versuchen Sie den Dateiinhalt mit einem Editor zu ändern. Was passiert?
* C 6.16 [!2] Legen Sie unter dem Namen ~/symlink ein symbolisches Link auf die Datei aus der vorigen Aufgabe an. Prüfen Sie, ob der Zugriff funktioniert. Was passiert, wenn Sie die Zieldatei des Links löschen?
* C 6.17 [!2] Auf welches Verzeichnis zeigt das ..-Link im Verzeichnis »/«?
* C 6.18 [3] Betrachten Sie das folgende Kommando und seine Ausgabe:
$ ls -ai /
2 . 330211 etc 1 proc 4303 var
2 .. 2 home 65153 root
4833 bin 244322 lib 313777 sbin
228033 boot 460935 mnt 244321 tmp
330625 dev 460940 opt 390938 usr
Offensichtlich haben die Verzeichnisse / und /home dieselbe Inodenummer. Da es sich dabei offensichtlich nicht wirklich um dasselbe Verzeichnis handeln kann können Sie dieses Phänomen erklären?
* C 6.19 [2] Betrachten Sie die Inode-Nummern der Links » . « und » .. « im Wurzelverzeichnis ( / ) und in einigen beliebigen anderen Verzeichnissen. Was fällt Ihnen auf?
* C 6.20 [3] Wir haben gesagt, dass harte Links auf Verzeichnisse nicht erlaubt sind. Welchen Grund könnte es dafür geben?
* C 6.21 [3] Woran erkennt man in der Ausgabe von » ls -l ~ «, dass ein Unterverzeichnis von ~ keine weiteren Unterverzeichnisse hat?
* C 6.22 [2] Wie verhalten sich » ls -lH « und » ls -lL «, wenn ein symbolisches Link auf ein anderes symbolisches Link zeigt?
### Dateien suchen - find
```bash
cd
sudo touch root_was_here
ls -l
find . -user root -print
```
```bash
find . -user root -exec ls -l '{}' \;
```
Testkriterien von find in Tabelle 6.6 S. 88
```bash
find . -atime +2 -exec ls -l '{}' \;
```
## Übungen
* C 6.25 [!2] Finden Sie alle Dateien in Ihrem System, die größer als 1 MiB sind, und lassen Sie deren Namen ausgeben.
* C 6.26 [2] Wie können Sie find benutzen, um eine Datei zu löschen, die einen merkwürdigen Namen hat (etwa mit unsichtbaren Kontrollzeichen oder mit Umlauten, die von älteren Shells nicht verstanden werden)?
* C 6.27 [3] (Beim zweiten Durcharbeiten.) Wie würden Sie beim Abmelden dafür sorgen, dass etwaige Dateien in /tmp , die Ihnen gehören, automatisch gelöscht werden?
### Datei schnell finden - locate un slocate
```bash
locate prog
```
```bash
sudo apt update && sudo apt install --yes mlocate
```
```bash
locate prog
```
```bash
sudo updatedb
```
```bash
locate prog
```
```bash
locate "*/prog*.c"
```
## Übungen
* C 6.28 [!1] README ist ein sehr populärer Dateiname. Geben Sie die absoluten Pfadnamen aller Dateien auf Ihrem System an, die README heißen.
* C 6.29 [2] Legen Sie eine neue Datei in Ihrem Heimatverzeichnis an und überzeugen Sie sich durch einen locate -Aufruf, dass diese Datei nicht gefunden wird (wählen Sie gegebenenfalls einen hinreichend ausgefallenen Dateinamen). Rufen Sie dann (mit Administratorrechten) das Programm updatedb auf. Wird Ihre neue Datei danach mit locate gefunden? Löschen Sie die Datei wieder und wiederholen Sie die vorigen Schritte.
* C 6.30 [1] Überzeugen Sie sich, dass slocate funktioniert, indem Sie als gewöhnlicher Benutzer nach Dateien wie /etc/shadow suchen.

83
Dateinamen.md Normal file

@ -0,0 +1,83 @@
### Dateinamen
Eine der wesentlichen Dienste eines Betriebssystems wie Linux besteht darin, Daten auf dauerhaften Speichermedien wie Festplatten oder USB-Sticks speichern und später wiederfinden zu können. Um das für Menschen erträglich zu gestalten, werden zusammengehörende Daten normalerweise zu `Dateien` zusammengefasst, die auf dem Speichermedium unter einem Namen gespeichert werden.
__Hinweis__
Auch wenn Ihnen das trivial vorkommen mag: Selbstverständlich ist das nicht. Betriebssysteme in früheren Zeiten machten es mitunter nötig, dass man Gräuel wie die passenden Spurnummern auf Platten kennen musste, wenn man seine Daten wieder finden wollte.
__Erlaubte Zeichen__
Bevor wir Ihnen erklären können, wie Sie mit Dateien umgehen, müssen wir Ihnen also erklären, wie Linux Dateien benennt.
In Linux-Dateinamen sind grundsätzlich __alle Zeichen__ zugelassen, die der Computer darstellen kann (und noch ein paar mehr). Da einige dieser Zeichen aber eine besondere Bedeutung haben, raten wir von deren Verwendung in Dateinamen aber ab. __Komplett verboten__ innerhalb von Dateinamen sind nur __zwei Zeichen__, der __Schrägstrich__ und das __Nullbyte__ (das Zeichen mit dem ASCII-Wert 0). Andere Zeichen wie _Leerzeichen_, _Umlaute_ oder _Dollarzeichen_ können verwendet werden, müssen dann aber auf der Kommandozeile meist durch einen _Rückstrich oder Anführungszeichen maskiert_ werden, um Fehlinterpretationen durch die Shell zu vermeiden.
__Achtung: Groß- und Kleinschreibung__
Eine Stolperfalle für Umsteiger ist, dass Linux in Dateinamen zwischen Groß- und Kleinschreibung unterscheidet. Im Gegensatz zu Windows, wo Groß- und Kleinbuchstaben in Dateinamen zwar dargestellt, aber identisch behandelt werden, interpretiert Linux x- files und X- Files tatsächlich als zwei verschiedene Dateinamen.
Dateinamen dürfen unter Linux _ziemlich lang_ sein eine feste allgemeinverbindliche Grenze gibt es nicht, da das __Maximum__ vom __Dateisystem__ abhängt, also der Methode, wie genau die Bytes auf der Platte arrangiert sind (davon gibt es unter Linux mehrere). Eine typische Obergrenze sind aber 255 Zeichen und da so ein Name auf einem normalen Textterminal gut drei Zeilen einnehmen würde,
sollte das Ihren Stil nicht übermäßig einschränken.
__Endungen__
Eine weitere Abweichung zu DOS- bzw. Windows-Rechnern besteht darin, Endungen dass bei Linux Dateien nicht durch entsprechende Endungen charakterisiert werden __müssen__. _Der Punkt ist in einem Dateinamen also ein ganz gewöhnliches Zeichen_. Ein Text kann daher als `blabla.txt` abgespeichert werden, aber einfach `blabla` wäre grundsätzlich ebenso zulässig. Was nicht heißt, dass Sie keine _Dateiendungen_ benutzen sollten immerhin erleichtern solche Kennzeichnungen die Identifizierung des Dateiinhaltes.
__Hinweis__
Manche Programme bestehen darauf, dass ihre Eingabedateien bestimmte Endungen haben. Der C-Übersetzer `gcc` zum Beispiel betrachtet Dateien mit Namen, die auf `.c` enden, als C-Quelltext, solche mit Namen auf `.s` als Assemblerquelltext und solche mit Namen auf `.o` als vorübersetzte Objektdateien.
__Sonderzeichen__
Umlaute und andere Sonderzeichen können Sie in Dateinamen grundsätzlich ungeniert verwenden. Sollen aber Dateien gleichermaßen auf anderen Systemen benutzt werden, ist es besser, auf Sonderzeichen in Dateinamen zu verzichten, da nicht garantiert ist, dass sie auf anderen Systemen als dieselben Zeichen erscheinen.
__Ortseinstellung__
Was mit Sonderzeichen passiert, hängt auch von der Ortseinstellung ab, da es keinen allgemein üblichen Standard dafür gibt, Zeichen darzustellen, die den Zeichenvorrat des ASCII (128 Zeichen, die im wesentlichen die englische Sprache, Ziffern und die gängigsten Sonderzeichen abdecken) überschreiten. In weitem Gebrauch sind zum Beispiel die Zeichentabellen `ISO 8859-1` und `ISO 8859-15` (vulgo `ISO-Latin-1` und `ISO-Latin-9` ... fragen Sie nicht) sowie `ISO 10646`, gerne salopp und nicht ganz korrekt als `Unicode` bezeichnet und in der Regel als `UTF-8` codiert. Dateinamen mit Sonderzeichen, die Sie anlegen, während Zeichentabelle X aktiv ist, können völlig anders aussehen, wenn Sie sich das Verzeichnis gemäß Zeichentabelle Y anschauen. Das ganze Thema ist nichts, worüber man beim Essen nachdenken möchte.
__`convmv`__
Sollten Sie jemals in die Verlegenheit kommen, einen Berg Dateien vor sich zu haben, deren Namen allesamt gemäß einer verkehrten Zeichentabelle codiert sind, kann Ihnen vielleicht das Programm `convmv` helfen, das Dateinamen zwischen verschiedenen Zeichentabellen konvertieren kann. (Sie werden es vermutlich selber installieren müssen, da es sich normalerweise nicht im Standardumfang gängiger Distributionen befindet.) Allerdings sollten Sie sich damit erst befassen, wenn Sie den Rest dieses Kapitels durchgearbeitet haben, denn wir haben Ihnen noch nicht einmal das reguläre `mv` erklärt ...
__Portable Dateinamen__
Ohne Bedenken lassen sich alle Zeichen aus
```
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789+-._
```
in Dateinamen benutzen. Allerdings sollten Sie die folgenden Tipps berücksichtigen:
* Um den Datenaustausch mit älteren Unix-Systemen zu ermöglichen, sollte die Länge eines Dateinamens gegebenenfalls maximal 14 Zeichen betragen.
* Dateinamen sollten stets mit einem der genannten Buchstaben oder einer Ziffer beginnen, die vier anderen Zeichen sind nur innerhalb eines Dateinamens problemlos verwendbar.
Diese Konventionen lassen sich am leichtesten mit ein paar Beispielen verstehen. Zulässige Dateinamen wären etwa:
```
X-files
bla.txt.bak
17.Juni
7_of_9
```
Schwierigkeiten wären dagegen möglich (wenn nicht gar wahrscheinlich oder sogar sicher) mit:
```
-20°C Beginnt mit » - «, Sonderzeichen
.profile Wird versteckt
3/4-Takt Enthält verbotenes Zeichen
Müll Enthält Umlaut
```
__Versteckte Dateien__
Als weitere Besonderheit werden Dateinamen, die mit einem Punkt (`.`) anfangen, an einigen Stellen (etwa beim Auflisten von Verzeichnisinhalten) übersprungen Dateien mit solchen Namen gelten als »versteckt«. Diese Eigenschaft verwendet man unter anderem gerne für Dateien, die Voreinstellungen für Programme enthalten und die in Dateinamenslisten nicht von wichtigeren Dateien
ablenken sollen.
__Hinweis__
Für DOS- und Windows-Experten: Diese Systeme erlauben »versteckte« Dateien über ein unabhängig vom Namen zu setzendes »Dateiattribut«. Unter Linux bzw. Unix gibt es so etwas nicht.

@ -0,0 +1,298 @@
## Kommandos für Verzeichnisse
### Das aktuelle Verzeichnis: cd & Co.
1. Wir gehen in unser `Benutzerverzeichnis` `~`.
2. Wechseln ins Verzeichenis `dateien` und
3. falls das Verzeichnis `briefe` existiert, wird dieses gelöscht. Sie können ganz einfach absolute von relativen Pfadnamen unterscheiden:
Ein Pfadname, der mit `/` anfängt, ist absolut; alle anderen Pfadnamen sind
relativ.
```bash
cd
cd dateien
pwd
if [ -d briefe ]; then rm -rf briefe; fi;
ls -l
```
/home/vagrant/dateien
insgesamt 16
-rw-rw-r-- 1 vagrant vagrant 0 Mär 21 2020 datei.txt
drwxrwxr-x 2 vagrant vagrant 4096 Mär 21 2020 geschweifte
drwxrwxr-x 3 vagrant vagrant 4096 Mär 21 2020 kopieren
drwxrwxr-x 2 vagrant vagrant 4096 Mär 21 2020 regulaere_Ausdruecke_-_Filter
drwxrwxr-x 2 vagrant vagrant 4096 Mär 21 2020 suchmuster
Wenn Sie `cd` keinen Parameter angeben, landen Sie in Ihrem Heimatverzeichnis.
Erstellen von Verzeichnissen und hineinwechseln
```bash
mkdir briefe
```
```bash
ls -ld briefe
```
drwxr-xr-x 2 vagrant vagrant 4096 Dez 22 10:44 briefe
```bash
cd briefe
```
__Aktuellen Verzeichnisnamen ausgeben__
Mit dem Kommando `pwd` (engl. print working directory) können Sie, wie im Beispiel zu sehen, den absoluten Pfadnamen des aktuellen Verzeichnisses ausgeben.
```bash
pwd
```
/home/vagrant/dateien/briefe
Dabei ist `~/briefe` eine Abkürzung für `/home/hugo/briefe`; die Tilde (`~`) steht für das Heimatverzeichnis des aktuellen Benutzers.
Übergeordnetes Verzeichnis
```bash
cd ..
pwd
```
/home/vagrant/dateien
Zurück ins Homeverzeichnis
```bash
cd
pwd
```
/home/vagrant
__Zurück ins vorheriges Verzeichnis__
Das Kommando `cd -` wechselt in das Verzeichnis, das vor dem letzten `cd`-Kommando aktuell war. Damit können Sie bequem zwischen zwei Verzeichnissen hin und her wechseln.
```bash
cd -
```
/home/vagrant/dateien
```bash
cd /var/www
```
```bash
pwd
```
/var/www
```bash
ls -l
```
insgesamt 4
drwxr-xr-x 3 root root 4096 Sep 11 22:56 html
```bash
cd html
```
```bash
pwd
```
/var/www/html
```bash
cd
```
```bash
pwd
```
/home/vagrant
```bash
cd -
```
/var/www/html
__Übungen__
* C 6.1 [2] Ist `cd` ein externes Kommando oder als internes Kommando in die Shell eingebaut? Warum?
* C 6.2 [3] Lesen Sie in der Handbuchseite der `bash` über die Kommandos `pushd`, `popd` und `dirs` nach. Überzeugen Sie sich, dass diese Kommandos funktionieren.
C 6.1 [2] Ist cd ein externes Kommando oder als internes Kommando in die Shell eingebaut? Warum?
### Dateien und Verzeichnisse auflisten ls
| Dateityp | Farbe | Zeichen ( ls -F ) | Kennung ( ls -l ) |
|----------|-------|-------------------|-------------------|
|gewöhnliche Datei|schwarz| keins | - |
|ausführbare Datei|grün| * | - |
|Verzeichnis|blau | / | d |
|Link |cyan | @ | l |
```bash
cd
cd dateien/briefe
touch datei.txt datei2.txt
```
```bash
ls -l
```
insgesamt 0
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 10:59 datei2.txt
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 10:59 datei.txt
## Übungen
C 6.1 [2] Ist cd ein externes Kommando oder als internes Kommando in die Shell eingebaut? Warum?
C 6.2 [3] Lesen Sie in der Handbuchseite der bash über die Kommandos pushd,
popd und dirs nach. Überzeugen Sie sich, dass diese Kommandos funktionieren.
### Dateien und Verzeichnisse auflisten ls
```bash
ls
```
datei2.txt datei.txt
```bash
ls -l
```
insgesamt 0
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 10:59 datei2.txt
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 10:59 datei.txt
## Übungen
* C 6.3 [1] Welche Dateien stehen im Verzeichnis /boot ? Hat das Verzeichnis Unerverzeichnisse und, wenn ja, welche?
* C 6.4 [2] Erklären Sie den Unterschied zwischen ls mit einem Dateinamen als Argument und ls mit einem Verzeichnisnamen als Argument.
* C 6.5 [2] Wie können Sie ls dazu bringen, bei einem Verzeichnisnamen als Argument Informationen über das benannte Verzeichnis selbst anstatt über die darin enthaltenen Dateien zu liefern?
### Verzeichnisse anlegen und löschen: mkdir und rmdir
```bash
cd ~/dateien
if [ -d bilder ]; then rm -rf bilder; fi;
#ohne if
# rm -rf bilder
```
```bash
mkdir bilder/urlaub
```
mkdir: das Verzeichnis »bilder/urlaub“ kann nicht angelegt werden: Datei oder Verzeichnis nicht gefunden
```bash
mkdir --parent bilder/urlaub
```
```bash
cd bilder
ls -F
```
murlaub
```bash
cd ~/dateien
rmdir bilder/urlaub
ls -F
```
bilder datei.txt kopieren/ suchmuster/
briefe/ geschweifte/ regulaere_Ausdruecke_-_Filter/
```bash
mkdir -p bilder/urlaub/sommer
rmdir bilder/urlaub/sommer
ls -F bilder
```
urlaub/
```bash
rmdir -p bilder/urlaub
ls -F bilder
```
ls: Zugriff auf 'bilder' nicht möglich: Datei oder Verzeichnis nicht gefunden
## Übungen
* C 6.6 [!2] Legen Sie in Ihrem Heimatverzeichnis ein Verzeichnis `grd1-test` mit den Unterverzeichnissen `dir1`, `dir2` und `dir3` an. Wechseln Sie ins Verzeichnis `grd1-test/dir1` und legen Sie (etwa mit einem Texteditor) eine Datei namens hallo mit dem Inhalt _hallo_ an. Legen Sie in `grd1-test/dir2` eine Datei namens `huhu` mit dem Inhalt _huhu_ an. Vergewissern Sie sich, dass diese Dateien angelegt wurden. Löschen Sie das Unterverzeichnis `dir3` mit `rmdir`.
Versuchen Sie anschließend, das Unterverzeichnis `dir2` mit `rmdir` zu löschen.
Was passiert und warum?

239
Suchmuster_für_Dateien.md Normal file

@ -0,0 +1,239 @@
## Suchmuster für Dateien
```bash
cd ~/dateien
ls suchmuster
```
a1.txt c1.txt p22.dat p-.c prog1.c prog-.c rot.txt
a2.txt c2.txt p22.txt p..c prog2.c prog.c untitled.txt
a3.txt c3.txt p2.c p.c prog3.c prog:.c
b1.txt gelb.txt p3.c pop-rock.c prog4.c prog_.c
b2.txt p1.c p4.c prog prog5.c progQ.c
b3.txt p1.txt pa.c prog12.c progabc.c progx.c
blau.txt p21.txt paulchen.c prog13.c prog+.c p.txt
```bash
ls suchmuster/p*.c
```
suchmuster/p1.c suchmuster/pop-rock.c suchmuster/prog+.c
suchmuster/p2.c suchmuster/prog12.c suchmuster/prog-.c
suchmuster/p3.c suchmuster/prog13.c suchmuster/prog.c
suchmuster/p4.c suchmuster/prog1.c suchmuster/prog:.c
suchmuster/pa.c suchmuster/prog2.c suchmuster/prog_.c
suchmuster/paulchen.c suchmuster/prog3.c suchmuster/progQ.c
suchmuster/p-.c suchmuster/prog4.c suchmuster/progx.c
suchmuster/p..c suchmuster/prog5.c
suchmuster/p.c suchmuster/progabc.c
```bash
ls suchmuster/p?.c
```
suchmuster/p1.c suchmuster/p3.c suchmuster/pa.c suchmuster/p..c
suchmuster/p2.c suchmuster/p4.c suchmuster/p-.c
```bash
ls suchmuster/prog[123].c
```
suchmuster/prog1.c suchmuster/prog2.c suchmuster/prog3.c
```bash
ls suchmuster/prog[1-9].c
```
suchmuster/prog1.c suchmuster/prog3.c suchmuster/prog5.c
suchmuster/prog2.c suchmuster/prog4.c
Achtung dies funktioniert anders als im Buch
```bash
ls suchmuster/prog[A-z].c
```
suchmuster/prog_.c suchmuster/progQ.c suchmuster/progx.c
```bash
ls suchmuster/prog[!A-z].c
```
suchmuster/prog1.c suchmuster/prog3.c suchmuster/prog5.c suchmuster/prog-.c
suchmuster/prog2.c suchmuster/prog4.c suchmuster/prog+.c suchmuster/prog:.c
### Geschweifte Klammern
```bash
cd ~/dateien
if [ -d geschweifte ]; then rm -rf geschweifte; fi;
```
```bash
mkdir geschweifte
ls -d geschweifte
cd geschweifte
```
geschweifte
```bash
touch {rot,blau,gelb}.txt
ls -l *.txt
```
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:22 blau.txt
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:22 gelb.txt
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:22 rot.txt
```bash
touch {a,b,c}{1,2,3}.dat
ls -l *.dat
```
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 a1.dat
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 a2.dat
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 a3.dat
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 b1.dat
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 b2.dat
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 b3.dat
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 c1.dat
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 c2.dat
-rw-r--r-- 1 vagrant vagrant 0 Dez 22 12:25 c3.dat
```bash
mkdir -p umsatz/201{6,7}/q{1,2,3,4}
tree umsatz
```
umsatz
├── 2016
│   ├── q1
│   ├── q2
│   ├── q3
│   └── q4
└── 2017
├── q1
├── q2
├── q3
└── q4
10 directories, 0 files
## Übungen
* C 6.7 [!1] Im aktuellen Verzeichnis stehen die Dateien
* prog.c
* p.txt
* prog1.c
* p1.txt
* prog2.c
* p21.txt
* progabc.c
* p22.txt
* prog
* p22.dat
Auf welche dieser Dateinamen passen die Suchmuster
(a) prog*.c,
(b) prog?.c,
(c) p?*.txt,
(d) p[12]*,
(e) p*,
(f) *.*
* C 6.8 [!2] Was ist der Unterschied zwischen » ls « und » ls * «? (Tipp: Probieren Sie beides in einem Verzeichnis aus, das Unterverzeichnisse enthält.)
* C 6.9 [2] Erklären Sie, warum das folgende Kommando zur angezeigten Ausgabe führt:
$ ls
-l datei1 datei2 datei3
$ ls *
-rw-r--r-- 1 hugo users 0 Dec 19 11:24 datei1
-rw-r--r-- 1 hugo users 0 Dec 19 11:24 datei2
-rw-r--r-- 1 hugo users 0 Dec 19 11:24 datei3
* C 6.10 [2] Warum ist es sinnvoll, dass » * « nicht auf Dateinamen mit Punkt am Anfang passt?
### Kopieren, Verschieben und Löschen cp und Verwandte
```bash
cd ~/dateien
if [ -d kopieren ]; then rm -rf kopieren; fi;
mkdir kopieren
ls -lisa >> kopieren/liste
cd kopieren
```
```bash
md5sum liste
```
```bash
cp liste liste2
md5sum liste2
```
```bash
ls -l /etc/passwd
md5sum /etc/passwd
cp /etc/passwd .
ls -l
md5sum passwd
```
```bash
mv passwd liste2
ls -l
md5sum *
```
```bash
rm lis*
```
```bash
ls -l
```
## Übungen
* C 6.11 [!2] Legen Sie in Ihrem Heimatverzeichnis eine Kopie der Datei /etc/services unter dem Namen myservices an. Benennen Sie sie um in srv.dat und kopieren Sie sie unter demselben Namen ins Verzeichnis /tmp. Löschen Sie anschließend beide Kopien der Datei.
* C 6.12 [1] Warum hat mv keine -R -Option wie cp?
* C 6.13 [!2] Angenommen, in einem Ihrer Verzeichnisse steht eine Datei namens »- file« (mit einem Minuszeichen am Anfang des Namens). Wie würden Sie diese Datei entfernen?
* C 6.14 [2] Wenn Sie ein Verzeichnis haben, in dem Sie nicht versehentlich einem »rm *« zum Opfer fallen wollen, können Sie dort eine Datei namens »- i« anlegen, etwa mit $ > -i (wird in Kapitel 7 genauer erklärt). Was passiert, wenn Sie jetzt das Kommando » rm * « ausführen, und warum?

25
Verzeichnisse.md Normal file

@ -0,0 +1,25 @@
### Verzeichnisse
Da auf demselben Linux-System potentiell viele Benutzer arbeiten können, wäre es ein Problem, wenn es jeden Dateinamen nur einmal geben dürfte. Dem Benutzer `Hugo` wäre wohl nur schwer klar zu machen, dass er keine Datei namens `brief.txt` anlegen kann, weil die Benutzerin `Susi` schon eine Datei hat, die so heißt. Außerdem muss irgendwie (bequem) geregelt werden können, dass `Hugo` nicht
alle Dateien von `Susi` lesen kann und umgekehrt.
Aus diesem Grund unterstützt Linux das Konzept __hierarchischer Verzeichnisse__, die zum Gruppieren von Dateien dienen. Dateinamen müssen nicht über das __ganze System__ hinweg __eindeutig__ sein, sondern nur im __selben Verzeichnis__. Das bedeutet insbesondere, dass `Hugo` und `Susi` vom System verschiedene Verzeichnisse zugeordnet bekommen können und darin dann jeweils ihre Dateien so nennen
dürfen, wie sie mögen, ohne aufeinander Rücksicht nehmen zu müssen. Ferner kann man `Hugo` den Zugriff auf `Susis` Verzeichnis verbieten (und umgekehrt) und muss sich dann nicht mehr um die einzelnen Dateien kümmern, die dort jeweils stehen.
__Schrägstrich__
Verzeichnisse sind bei Linux auch nur Dateien, wenn auch Dateien, die Sie nicht mit denselben Mitteln bearbeiten können wie _gewöhnliche_ Dateien. Das bedeutet aber, dass für die Namen von Verzeichnissen dieselben Regeln gelten wie für die Namen von Dateien (siehe voriger Abschnitt). Sie müssen nur noch lernen, dass der Schrägstrich (`/`) dazu dient, Dateinamen von Verzeichnisnamen und Verzeichnisnamen voneinander zu trennen. `hugo/brief.txt` wäre also die Datei `brief.txt` im Verzeichnis `hugo`.
__Verzeichnisbaum__
Verzeichnisse können andere Verzeichnisse enthalten (das ist das _hierarchisch_ von weiter vorne), wodurch sich eine baumartige Struktur ergibt (naheliegenderweise gerne `Verzeichnisbaum` genannt). Ein Linux-System hat ein spezielles Verzeichnis, das die Wurzel des Baums bildet und deswegen `Wurzelverzeichnis` oder neudeutsch `root directory` genannt wird. Es hat nach Konvention den Namen `/` (Schrägstrich).
__Hinweis__
Trotz seiner englischen Bezeichnung hat das Wurzelverzeichnis __nichts mit dem Systemverwalter root zu tun__. Die beiden heißen einfach nur so ähnlich.
__Hinweis__
Der Schrägstrich spielt hier eine Doppelrolle er dient sowohl als Name des Wurzelverzeichnisses als auch als Trennzeichen zwischen anderen Verzeichnissen. Hierzu gleich mehr.
Die Grundinstallation gängiger Linux-Distributionen enthält normalerweise Zehntausende von Dateien in einer größtenteils durch gewisse Konventionen vorstrukturierten Verzeichnishierarchie. Über diese Verzeichnishierarchie erfahren Sie mehr in Kapitel 9

8
linux_kernel.md Normal file

@ -0,0 +1,8 @@
# Was ist ein Linux Kernel
Der Linux-Kernel ist ein Open-Source-Betriebssystemkernel, der die grundlegenden Funktionen und Dienste des Betriebssystems bereitstellt. Es ist das Herzstück des Linux-Betriebssystems und fungiert als eine Schnittstelle zwischen der Hardware und der Software eines Computersystems.
Der Linux-Kernel verwaltet Ressourcen wie Speicher, Prozesse, Dateisysteme, Ein-/Ausgabegeräte und Netzwerke. Er bietet Funktionen zur Unterstützung von Mehrbenutzerbetrieb, Dateisystemverwaltung, Gerätetreibern, Netzwerkprotokollen und anderen wesentlichen Betriebssystemdiensten.
Der Linux-Kernel wird von einer großen Entwicklercommunity weltweit gepflegt und weiterentwickelt. Es handelt sich um freie Software und wird unter der GNU General Public License (GPL) veröffentlicht. Dementsprechend kann der Linux-Kernel von jedem gen
utzt, modifiziert und verbreitet werden. Es gibt viele verschiedene Distributionen von Linux, die den Linux-Kernel mit zusätzlicher Software und Tools kombinieren, um ein vollständiges Betriebssystem zu bilden.

@ -108,3 +108,22 @@ localhost ansible_connection=local
ansible -i inventory -m ping notme
ansible -i inventory -m ping all
```
```bash
vi ansible.cfg
cat ansible.cfg
```
```
[defaults]
inventory = ./inventory
```
```bash
ansible -m ping all
ansible --version
```
```
ansible [core 2.12.4]
config file = /home/vagrant/ansible_lxc_bsa2/ansible.cfg
...
```

18
lxc_funktion.md Normal file

@ -0,0 +1,18 @@
# Wie funktioniert lxc
LXC steht für "LinuX Containers" und ist eine Betriebssystem-Level-Virtualisierungstechnologie. Es ermöglicht die Erstellung und Verwaltung von isolierten Containern auf einem Linux-Hostsystem.
Der LXC-Ansatz basiert auf dem cgroups- und namespaces-Feature des Linux-Kernels. Diese Features bieten die Möglichkeit, Ressourcen wie CPU, Speicher und Netzwerk isoliert auf Container-Ebene zu zuweisen. Darüber hinaus sorgen die namespaces dafür,
dass Container ihre eigenen Sichtbarkeiten innerhalb des Systems haben, sodass sie voneinander isoliert sind.
Um LXC zu nutzen, müssen zunächst die entsprechenden Kernel-Module auf dem Hostsystem geladen sein. Dies kann über den Linux-Kernel-Konfigurationsmanager oder durch das Laden der entsprechenden Kernel-Module erfolgen.
Anschließend können mit Tools wie "lxc-create" und "lxc-start" Container erstellt und gestartet werden. LXC verwendet einen Template-basierten Ansatz, um die Erstellung von Containern zu vereinfachen. Es stehen verschiedene Vorlagen zur Verfügung, wie z.B. "ubuntu" oder "centos", die als Basis für die Container verwendet werden können.
Einmal gestartet, können Container mit dem Befehl "lxc-attach" verwaltet werden. Dies ermöglicht das Ausführen von Befehlen innerhalb des Containers und das Anzeigen seines Status.
Es ist zu beachten, dass LXC keine volle Virtualisierungstechnologie ist, sondern eine leichtgewichtige Form der Isolation von Betriebssystemressourcen bietet. Dies macht es effizienter als traditionelle Virtualisierungslösungen wie z.B. VirtualBox oder VMware, da es weniger Overhead und eine geringere Startzeit für Container hat.
LXC kann vielseitig eingesetzt werden, z.B. für die Bereitstellung von isolierten Entwicklungs- oder Testumgebungen, das Partitionieren eines Hostsystems in mehrere logische Einheiten oder die Bereitstellung von sicheren Containern für Webanwendungen.
Insgesamt bietet LXC eine flexible und effiziente Möglichkeit, Container auf Linux-Hostsystemen bereitzustellen und zu verwalten. Es ist eine beliebte Wahl für Entwickler und Systemadministratoren, die isolierte und skalierbare Umgebungen benötigen.

BIN
pictures/grep-filter.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB