diff --git a/Dateien.md b/Dateien.md new file mode 100644 index 0000000..33a803e --- /dev/null +++ b/Dateien.md @@ -0,0 +1,957 @@ +# Dateien: Aufzucht und Pflege + +S. 67 ff. + +__Lernziele__ + +* Die Linux-Konventionen über Datei- und Verzeichnisnamen kennen + +* Die wichtigsten Kommandos zum Umgang mit Dateien und Verzeichnissen beherrschen + +* Mit Suchmustern in der Shell umgehen können + +__Vorkenntnisse__ + +* Arbeit mit der Shell (siehe Kapitel 2) + +* Umgang mit einem Texteditor (siehe Kapitel 5) + +## Datei- und Pfadnamen + +### 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. + +### 6.2.2 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? + +### 6.2.3 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 +``` + + urlaub/ + + + +```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? + +## 6.3 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 + + +### 6.3.3 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? + +### 6.4.1 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? + +## 6.4.2 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? + +### 6.4.4 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? + +### 6.4.5 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 + +``` +cd Wechselt das aktuelle Arbeitsverzeichnis der Shell bash (1) +convmv Konvertiert Dateinamen zwischen Zeichenkodierungen convmv (1) +cp Kopiert Dateien cp (1) +find Sucht nach Dateien, die bestimmte Kriterien erfüllen find (1), Info: find +less Zeigt Texte (etwa Handbuchseiten) seitenweise an less (1) +ln Stellt (_harte_ oder _symbolische_) Links her ln (1) +locate Sucht Dateien über ihren Namen in einer Dateinamensdatenbank locate (1) +ls Listet Dateien oder den Inhalt von Verzeichnissen auf ls (1) +mkdir Legt neue Verzeichnisse an mkdir (1) +more Zeigt Textdaten seitenweise an more (1) +mv Verschiebt Dateien in andere Verzeichnisse oder benennt sie um mv (1) +pwd Gibt den Namen des aktuellen Arbeitsverzeichnisses aus pwd (1), bash (1) +rm Löscht Dateien oder Verzeichnisse rm (1) +rmdir Entfernt (leere) Verzeichnisse rmdir (1) +slocate Sucht Dateien über ihren Namen in einer Datenbank und beachtet dabei deren Zugriffsrechte slocate (1) +updatedb Erstellt die Dateinamensdatenbank für locate updatedb (1) +xargs Konstruiert Kommandozeilen aus seiner Standardeingabe xargs (1), Info: find +``` + +## Zusammenfassung + +* In Dateinamen dürfen fast alle möglichen Zeichen auftauchen. Im Interesse der Portabilität sollte man sich aber auf Buchstaben, Ziffern und einige Sonderzeichen beschränken. + +* Linux unterscheidet Groß- und Kleinschreibung in Dateinamen. + +* Absolute Pfade beginnen immer mit einem Schrägstrich und benennen alle Verzeichnisse vom Wurzelverzeichnis des Verzeichnisbaums bis zum betreffenden Verzeichnis bzw. der Datei. Relative Pfade beziehen sich auf das _aktuelle Verzeichnis_. + +* Mit `cd` können Sie das aktuelle Verzeichnis der Shell ändern, mit pwd können Sie seinen Namen anzeigen. + +* ls gibt Informationen über Dateien und Verzeichnisse aus. + +* Mit mkdir und rmdir können Sie Verzeichnisse anlegen oder entfernen. + +* Die Kommandos `cp`, `mv` und `rm` kopieren, verschieben und löschen Dateien und Verzeichnisse. + +* Mit `ln` können Sie »harte« und »symbolische« Links anlegen. + +* `more` und `less` dienen zum seitenweisen Anzeigen von Dateien auf dem Terminal. + +* `find` sucht nach Dateien oder Verzeichnissen, die bestimmte Kriterien erfüllen. diff --git a/Home.md b/Home.md index c942c12..f030de5 100644 --- a/Home.md +++ b/Home.md @@ -20,3 +20,7 @@ hinzu. * [Keine Angst vor der Shell](Keine_Angst_vor_der_Shell) * [Hilfe](Hilfe) + +* `vimtutor` + +* [Dateien](Dateien)