Sie sind auf Seite 1von 80

Übung Grundlagen der

Betriebssysteme (GBS)
Tafelübung 3: Dateisystem
Daniel Lohmann, Björn Fiedler
03t-datei 2018-11-13

Institute for Systems Engineering


System- und Rechnerarchitektur (SRA)

Wintersemester 2018

https://sra.uni-hannover.de/Lehre/WS18/V_GBS
Überblick: Tafelübung 3: Dateisystem

3 Tafelübung 3: Dateisystem
3.1 Beispiellösung Aufgabe 1
3.2 Aufgabe 3
3.3 Argumentparser
3.4 Wildcards
3.5 Reguläre Ausdrücke
3.6 Aufbau eines Dateisystems
3.7 Rechteverwaltung im Dateisystem
3.8 Dateisystem-Interaktion
03t-datei 2018-11-13

3.9 Dateisystem interaktion aus C


3.10 Dateisystem interaktion aus der Shell
Beispiellösung Aufgabe 1
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.1 Beispiellösung Aufgabe 1 3–3
Aufgabe 3 - Dateisystem Interaktion

Aufgabenteile
Theoriefragen
crawl - Durchsuche das Dateisystem
ArgumentParser - Parser für Kommandozeilen Argumente
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.2 Aufgabe 3 3–4


crawl
crawl path... [-maxdepth=n] [-name=pattern] [-type={d,f}]
[-size=[+|-]n] [-line=string]

Angegebenes Verszeichnis rekursiv durchsuchen


Auflisten der passenden Dateien (und Zeilen)
Kriterien:
-name (Wildcard-)Pattern auf Dateinamen
-size Vergleich der Dateigröße
-type Typ der aufzulistenden Dateien
-line Regulärer Ausdruck, anzuwenden auf Zeilen der Dateien
-maxdepth Maximale Suchtiefe
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.2 Aufgabe 3 3–5


crawl
crawl path... [-maxdepth=n] [-name=pattern] [-type={d,f}]
[-size=[+|-]n] [-line=string]

Angegebenes Verszeichnis rekursiv durchsuchen


Auflisten der passenden Dateien (und Zeilen)
Kriterien:
-name (Wildcard-)Pattern auf Dateinamen
-size Vergleich der Dateigröße
-type Typ der aufzulistenden Dateien
-line Regulärer Ausdruck, anzuwenden auf Zeilen der Dateien
-maxdepth Maximale Suchtiefe
03t-datei 2018-11-13

bjoe.fiedler@gbs:/gbs/aufgaben/a1$ ../a3/crawl . -name "*log"


./testdir/resources/Downloads/2014-03-03.log
./testdir/resources/utility/ProgrammAufrufe.log
./testdir/log/
...

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.2 Aufgabe 3 3–5


Wie komme ich an die Argumente?

bjoe.fiedler@gbs:~$ ls -a -l /etc

int main(int argc, char *argv[])


03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.3 Argumentparser 3–6


Wie komme ich an die Argumente?

bjoe.fiedler@gbs:~$ ls -a -l /etc

int main(int argc, char *argv[])

argc Anzahl der Argumente


argv Array mit Zeigern auf die Argumente

argc 4

argv • • ’l’ ’s’ ’\0’


03t-datei 2018-11-13

• ’-’ ’a’ ’\0’

• ’-’ ’l’ ’\0’

• ’/’ ’e’ ’t’ ’c’ ’\0’

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.3 Argumentparser 3–6


Parser für Argumente
Schnittstelle:
int initArgumentParser(int argc, char* argv[]); Initialisierung des
Argumentenparsers. Prüft die
Argumente auf plausibilität
und bereitet die folgenden
Aufrufe vor.
char* getCommand(void); Liefert den Namen des
aufgerufenen Programms
char* getValueForOption(char* keyName); Liefert den Wert der benannten
Option. Optionen können als
Schlüssel-Wert-Paare der Form
-key=value übergeben werden.

int getNumberOfArguments(void); Liefert die Anzahl der


angegebenen Argumente.
char* getArgument(int index); Liefert das entsprechende
03t-datei 2018-11-13

Argument.
Erlaubte Verwendung:

command [arg]... [-option=value]...

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.3 Argumentparser 3–7


Wildcards

... erlauben Beschreibung von Mustern für Pfadnamen


* beliebiger Teilstring (inklusive leerer String)
? genau ein beliebiges Zeichen
[a-d] ein Zeichen aus den Zeichen a - d
[!a-d] ein Zeichen nicht aus den Zeichen a - d
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.4 Wildcards 3–8


Wildcards

... erlauben Beschreibung von Mustern für Pfadnamen


* beliebiger Teilstring (inklusive leerer String)
? genau ein beliebiges Zeichen
[a-d] ein Zeichen aus den Zeichen a - d
[!a-d] ein Zeichen nicht aus den Zeichen a - d
Dateien, die mit einem '.' beginnen, müssen explizit getroffen werden
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.4 Wildcards 3–8


Wildcards

... erlauben Beschreibung von Mustern für Pfadnamen


* beliebiger Teilstring (inklusive leerer String)
? genau ein beliebiges Zeichen
[a-d] ein Zeichen aus den Zeichen a - d
[!a-d] ein Zeichen nicht aus den Zeichen a - d
Dateien, die mit einem '.' beginnen, müssen explizit getroffen werden
Weitere und ausführliche Beschreibung siehe glob(7)
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.4 Wildcards 3–8


Wildcards

... erlauben Beschreibung von Mustern für Pfadnamen


* beliebiger Teilstring (inklusive leerer String)
? genau ein beliebiges Zeichen
[a-d] ein Zeichen aus den Zeichen a - d
[!a-d] ein Zeichen nicht aus den Zeichen a - d
Dateien, die mit einem '.' beginnen, müssen explizit getroffen werden
Weitere und ausführliche Beschreibung siehe glob(7)
Werden von der Shell expandiert, wenn im jeweiligen Verzeichnis passende
Dateinamen existieren
Quoting notwendig, wenn Muster als Argument übergeben wird
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.4 Wildcards 3–8


Fun with Wildcards

test* *test* test?.* t[1x].* t[!12].* .text*


.text.c
attest.doc
t1.tar
t2.txt
test.c
test2.c
tx.map
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.4 Wildcards 3–9


Fun with Wildcards

test* *test* test?.* t[1x].* t[!12].* .text*


.text.c
attest.doc
t1.tar
t2.txt
test.c X
test2.c X
tx.map
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.4 Wildcards 3–9


Fun with Wildcards

test* *test* test?.* t[1x].* t[!12].* .text*


.text.c
attest.doc X
t1.tar
t2.txt
test.c X X
test2.c X X
tx.map
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.4 Wildcards 3–9


Fun with Wildcards

test* *test* test?.* t[1x].* t[!12].* .text*


.text.c
attest.doc X
t1.tar
t2.txt
test.c X X
test2.c X X X
tx.map
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.4 Wildcards 3–9


Fun with Wildcards

test* *test* test?.* t[1x].* t[!12].* .text*


.text.c
attest.doc X
t1.tar X
t2.txt
test.c X X
test2.c X X X
tx.map X
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.4 Wildcards 3–9


Fun with Wildcards

test* *test* test?.* t[1x].* t[!12].* .text*


.text.c
attest.doc X
t1.tar X
t2.txt
test.c X X
test2.c X X X
tx.map X X
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.4 Wildcards 3–9


Fun with Wildcards

test* *test* test?.* t[1x].* t[!12].* .text*


.text.c X
attest.doc X
t1.tar X
t2.txt
test.c X X
test2.c X X X
tx.map X X
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.4 Wildcards 3–9


Wildcards auswerten

... mit der Funktion fnmatch(3)


int fnmatch(const char *pattern, const char *string, int flags);

Prüft, ob der String string zum Wildcard-Muster pattern passt


03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.4 Wildcards 3–10


Wildcards auswerten

... mit der Funktion fnmatch(3)


int fnmatch(const char *pattern, const char *string, int flags);

Prüft, ob der String string zum Wildcard-Muster pattern passt


Flags (0 oder bitweises Oder von ein oder mehreren der Werte)
FNM_PATHNAME: Ein Slash in string wird nur von einem Slash-Zeichen in
pattern getroffen, nicht von einem Wildcard-Zeichen
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.4 Wildcards 3–10


Wildcards auswerten

... mit der Funktion fnmatch(3)


int fnmatch(const char *pattern, const char *string, int flags);

Prüft, ob der String string zum Wildcard-Muster pattern passt


Flags (0 oder bitweises Oder von ein oder mehreren der Werte)
FNM_PATHNAME: Ein Slash in string wird nur von einem Slash-Zeichen in
pattern getroffen, nicht von einem Wildcard-Zeichen
FNM_PERIOD: Ein führender Punkt in einer Pfadkomponente muss von einem
korrespondierenden Punkt in pattern getroffen werden
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.4 Wildcards 3–10


Wildcards auswerten

... mit der Funktion fnmatch(3)


int fnmatch(const char *pattern, const char *string, int flags);

Prüft, ob der String string zum Wildcard-Muster pattern passt


Flags (0 oder bitweises Oder von ein oder mehreren der Werte)
FNM_PATHNAME: Ein Slash in string wird nur von einem Slash-Zeichen in
pattern getroffen, nicht von einem Wildcard-Zeichen
FNM_PERIOD: Ein führender Punkt in einer Pfadkomponente muss von einem
korrespondierenden Punkt in pattern getroffen werden
Weitere Flags siehe Man-Page
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.4 Wildcards 3–10


Reguläre Ausdrücke

... erlauben Beschreibung von Mustern für Zeichenketten


Zeichen Mengen
[a-z] Kleinbuchstaben von a bis z
[:digit:] Ziffern
Wiederholungen
? 0 oder 1 mal
* Beliebig oft, auch 0 mal
{m,n} m bis n mal
Kontrollfluss
| Alternative
() Gruppierung
03t-datei 2018-11-13

Ausführliche Beschreibung siehe regex(7) , grep(1)


Bei Angabe auf der Shell muss auf Maskierung geachtet werden
Sonst interpretiert die Shell fälschlicherweise Teile

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.5 Reguläre Ausdrücke 3–11
Reguläre Ausdrücke

... im C-Programm (siehe regex(3) )


Zweischrittiges Verfahren
1. Vorbereiten
int regcomp(regex_t *preg, const char *regex, int cflags);

2. Anwenden
int regexec(const regex_t *preg, const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags);
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.5 Reguläre Ausdrücke 3–12
Dateien und Verzeichnisse (UNIX)
Systemsicht: Datenstrukturen Dateisystem (file system)

Verzeichnisdatei Indexknotentabelle Datei

<name> i
Text &
i Daten

Indexknoten

Die Indexknotentabelle (inode table) ist ein statisches Feld (array ) von
Indexknoten (inodes) und die zentrale Datenstruktur.
Indexknoten: Deskriptor des Objektes (Datei)
Indexknotennummer: Eindeutige Referenz des Objektes
Ein Verzeichnis (directory ) ist eine Abbildungstabelle, es übersetzt
04-Dateisysteme 2018-10-16

symbolisch repräsentierte Namen in Indexknotennummern


03t-datei 2018-11-13

Spezielle Datei der Namensverwaltung des Betriebssytems


Eine Datei (file) ist eine abgeschlossene Einheit zusammenhängender Daten
beliebiger Repräsentation, Struktur und Bedeutung.

© dl GBS (WS 18) 4 Dateien und Dateisysteme | 4.4 Systemsicht – Dateibaum 4–15

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.6 Aufbau eines Dateisystems 3–13
Dateien und Verzeichnisse (UNIX)
Dateiattibute (file attributs

Der Indexknoten aggregiert Attribute (Metadaten) eines (Datei-)Objektes:


Typ der Datei (reguläre Datei, Verzeichnisdatei, soft link, Gerät, Pipe, Socket)
Anzahl der Verzeichnisverweise (link counter ) Referenzzählung: Wird der
link counter null, wird die
Größe der Datei Datei gelöscht. ,→ 4–12
Eigentümer der Datei (user ID)
Gruppenzugehörigkeit (group ID)
Rechte (jeweils für Eigentümer, Gruppe und Welt) Name ist kein Attribut!

Zeitstempel (letzter Zugriff, letzte Änderung, letzte Attributänderung)


Weitere Attribute sind implementierungsspezifisch für das Dateisystem
04-Dateisysteme 2018-10-16

Zusätzliche Metadaten (z.B. „tags“ oder Rechteverwaltung über ACLs)


Insbesondere jedoch die Objektdatenverweise (z.B. Festplattenblöcke)
03t-datei 2018-11-13

Die Indexknotennummer ist eindeutig innerhalb des Dateisystems


Vergleichbar mit einer Adresse in einem Adressraum

© dl GBS (WS 18) 4 Dateien und Dateisysteme | 4.4 Systemsicht – Dateibaum 4–17

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.6 Aufbau eines Dateisystems 3–14
Rechte auf Verzeichniseinträgen

UNIX sieht folgende Zugriffsrechte vor (davor die Darstellung des


jeweiligen Rechts bei der Ausgabe des ls-Kommandos)
r lesen (getrennt für User, Group und Others einstellbar)
w schreiben (analog)
x ausführen (bei regulären Dateien) bzw. Durchgriffsrecht (bei Verzeichnissen)
s setuid/setgid-Bit: bei einer ausführbaren Datei mit dem Laden der Datei in
einen Prozess (exec) erhält der Prozess die Benutzer (bzw. Gruppen)-Rechte
des Dateieigentümers
s setgid-Bit: bei einem Verzeichnis: neue Dateien im Verzeichnis erben die
Gruppe des Verzeichnisses statt der des anlegenden Benutzers
t bei Verzeichnissen: es dürfen trotz Schreibrecht im Verzeichnis nur eigene
03t-datei 2018-11-13

Dateien gelöscht werden

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.6 Aufbau eines Dateisystems 3–15
Wofür brauchen wir Rechte?

Auf einem Mehrbenutzersystem wie dem GBS Server mit über 300
Anwendern sind sinnvolle Restriktionen essenziell:
Man will seine privaten Dokumente vor fremden Augen schützen.
Nur Administratoren sollen die Konfiguration der Rechner verändern
können.
Kryptografie setzt die bedingungslose Geheimhaltung der verwendeten
Schlüssel voraus!
rechte 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–16
Wofür brauchen wir Rechte?

Auf einem Mehrbenutzersystem wie dem GBS Server mit über 300
Anwendern sind sinnvolle Restriktionen essenziell:
Man will seine privaten Dokumente vor fremden Augen schützen.
Nur Administratoren sollen die Konfiguration der Rechner verändern
können.
Kryptografie setzt die bedingungslose Geheimhaltung der verwendeten
Schlüssel voraus!

Lösung: Der „Rechtsstaat“


Für jede Datei und jedes Verzeichnis werden Berechtigungen vermerkt.
Nur wer die entsprechenden Rechte besitzt, kann auf ein bestimmtes
rechte 2018-11-13

Objekt zugreifen.

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–16
Ein paar Grundlagen

Gruppenkonzept
Jeder Benutzer ist in mindestens einer Gruppe (hier: student).
Man kann in mehr als einer Gruppe sein.
rechte 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–17
Ein paar Grundlagen

Gruppenkonzept
Jeder Benutzer ist in mindestens einer Gruppe (hier: student).
Man kann in mehr als einer Gruppe sein.

Einteilung der Benutzer


Pro Objekt im Dateisystem sind die Rechte für drei Klassen von Benutzern
gespeichert:
User Diesem Benutzer „gehört“ die Datei / das Verzeichnis.
Er darf Dateiberechtigungen vergeben.
Group Die Datei / das Verzeichnis ist dieser Gruppe zugeordnet.
rechte 2018-11-13

Others Alle anderen.

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–17
Rechte auf Dateien

Und welche Berechtigungen hat eine Datei / ein Verzeichnis?


ls -l zeigt eine ausführliche Ausgabe.
Dabei zeigt die erste Spalte die Rechte an.
Die dritte und vierte Spalte geben den Eigentümer bzw. die
Eigentümergruppe an.

$ ls -l
- rw- r-- r-- 1 bjoe.fiedler student 97 Oct 7 14:38 datei
- rwx r-x --- 1 bjoe.fiedler student 84 Oct 12 14:39 programm
rechte 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–18
Rechte auf Dateien

$ ls -l
- rw- r-- r-- 1 bjoe.fiedler student 97 Oct 7 14:38 datei
- rwx r-x --- 1 bjoe.fiedler student 84 Oct 7 14:39 programm
d rwx r-x r-x 2 bjoe.fiedler student 40 Oct 7 14:37 verzeichnis

Und was heißt das jetzt?


Das erste Zeichen zeigt den Typ an (z. B. d für ein Verzeichnis oder
- für normale Dateien).
Die nächsten drei Zeichen zeigen die Rechte für den User.
Das zweite Zeichentripel zeigt die Rechte für die Group.
rechte 2018-11-13

Und die verbleibenden drei Zeichen die Rechte für den Rest der Welt
(Others).

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–19
Rechte auf Dateien

$ ls -l
- rw- r-- r-- 1 bjoe.fiedler student 97 Oct 7 14:38 datei
- rwx r-x --- 1 bjoe.fiedler student 84 Oct 7 14:39 programm
d rwx r-x r-x 2 bjoe.fiedler student 40 Oct 7 14:37 verzeichnis

r? w? x?
r = lesbar (read)
w = schreibbar (write)
x = ausführbar (execute)

ausführbare Dateien
rechte 2018-11-13

$ ./programm führt Programm im aktuellen Verzeichnis aus

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–19
Rechte ändern

Rechte ändern
chmod <mode> <Datei|Verzeichnis>
chmod -R <mode> <Datei|Verzeichnis> (rekursiv)

$ chmod foo.bar

Das mode-Argument setzt sich zusammen aus drei Teilen


rechte 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–20
Rechte ändern

Rechte ändern
chmod <mode> <Datei|Verzeichnis>
chmod -R <mode> <Datei|Verzeichnis> (rekursiv)

$ chmod g foo.bar

Das mode-Argument setzt sich zusammen aus drei Teilen


Wen betrifft es?
u Benutzer
g Gruppe
rechte 2018-11-13

o Rest
a alle

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–20
Rechte ändern

Rechte ändern
chmod <mode> <Datei|Verzeichnis>
chmod -R <mode> <Datei|Verzeichnis> (rekursiv)

$ chmod g+ foo.bar

Das mode-Argument setzt sich zusammen aus drei Teilen


Wen betrifft es? Welche Aktion?
u Benutzer + Rechte geben
g Gruppe - Rechte wegnehmen
rechte 2018-11-13

o Rest = Rechte setzen


a alle

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–20
Rechte ändern

Rechte ändern
chmod <mode> <Datei|Verzeichnis>
chmod -R <mode> <Datei|Verzeichnis> (rekursiv)

$ chmod g+rx foo.bar

Das mode-Argument setzt sich zusammen aus drei Teilen


Wen betrifft es? Welche Aktion? Welche Rechte?
u Benutzer + Rechte geben r lesen
g Gruppe - Rechte wegnehmen w schreiben
rechte 2018-11-13

o Rest = Rechte setzen x ausführen


a alle

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–20
Änderungen im Rechtesystem

$ chmod u+r datei

$ chmod go-rwx datei

$ chmod a+rx datei

$ chmod u=rwx,g=rx,o= datei


rechte 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–21
Änderungen im Rechtesystem

Aber ich kann besser mit Zahlen als mit Zeichen!

Kein Problem:
rwx r-x --- Symbolische Notation

111 101 000 Binär

4+2+1 4+0+1 0+0+0 Umrechnung → oktal


rechte 2018-11-13

7 5 0 $ chmod 750 <datei>

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–22
Rechte auf Verzeichnissen

$ ls -l
- rw- r-- r-- 1 bjoe.fiedler student 97 Oct 7 14:38 datei
d rwx r-x r-x 2 bjoe.fiedler student 40 Oct 7 14:37 verzeichnis

Aber Moment! Wie können Verzeichnisse ausführbar sein?


Für Verzeichnisse gilt:
Lesbar: Inhalt des Verzeichnisses kann aufgelistet werden.
(z. B. mit ls)
Schreibbar: Weitere Verzeichnisse und Dateien können angelegt bzw.
gelöscht werden.
Ausführbar: Verzeichnis kann betreten werden (⇒ Kein Zugriff auf
rechte 2018-11-13

Namen der darin befindlichen Dateien und Verzeichnisse).

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–23
Rechte auf Verzeichnissen

$ ls -l verzeichnis/
- rw- --- --- 1 bjoe.fiedler student 97 Oct 7 14:38 dokument
d rwx --- --- 1 bjoe.fiedler student 97 Oct 7 14:38 ordner

$ chmod -R a+rx verzeichnis/

Was passiert jetzt in verzeichnis?


rechte 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–24
Rechte auf Verzeichnissen

$ ls -l verzeichnis/
- rw- --- --- 1 bjoe.fiedler student 97 Oct 7 14:38 dokument
d rwx --- --- 1 bjoe.fiedler student 97 Oct 7 14:38 ordner

$ chmod -R a+rx verzeichnis/

Was passiert jetzt in verzeichnis?

$ ls -l verzeichnis/
- rwx r-x r-x 1 bjoe.fiedler student 97 Oct 7 14:38 dokument
d rwx r-x r-x 1 bjoe.fiedler student 97 Oct 7 14:38 ordner
rechte 2018-11-13

Ups…

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–24
Rechte auf Verzeichnissen
Stattdessen:
$ ls -l verzeichnis/
- rw- --- --- 1 bjoe.fiedler student 97 Oct 7 14:38 dokument
d rwx --- --- 1 bjoe.fiedler student 97 Oct 7 14:38 ordner

$ chmod -R a+rX verzeichnis/

$ ls -l verzeichnis/
- rw- r-- r-- 1 bjoe.fiedler student 97 Oct 7 14:38 dokument
d rwx r-x r-x 1 bjoe.fiedler student 97 Oct 7 14:38 ordner

chmod -R +X
Setzt das x-Recht nur dort, wo schon für irgendeinen Benutzer
rechte 2018-11-13

x-Rechte eingetragen sind.


Also normalerweise nur bei Verzeichnissen und Programmdateien.

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–25
Verzeichnis abdichten

Neu erstellte Verzeichnisse sind standardmäßig für alle Nutzer les- und
betretbar. Dies kann dies problematisch sein.
$ mkdir /tmp/he29heri
$ ls -ld /tmp/he29heri
drwxr-xr-x 2 he29heri student 4096 Oct 5 15:35 /proj/ciptmp/he29heri

Andere Benutzer können den Inhalt dieses Verzeichnisses zwar nicht


verändern, aber immerhin durchsuchen.
Ihr seid für die Sicherheit eurer Daten selber verantwortlich!
rechte 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–26
Verzeichnis abdichten

Neu erstellte Verzeichnisse sind standardmäßig für alle Nutzer les- und
betretbar. Dies kann dies problematisch sein.
$ mkdir /tmp/he29heri
$ ls -ld /tmp/he29heri
drwxr-xr-x 2 he29heri student 4096 Oct 5 15:35 /proj/ciptmp/he29heri

Andere Benutzer können den Inhalt dieses Verzeichnisses zwar nicht


verändern, aber immerhin durchsuchen.
Ihr seid für die Sicherheit eurer Daten selber verantwortlich!
Auf Nummer sicher gehen:
rechte 2018-11-13

$ chmod 700 /tmp/he29heri

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–26
Änderungen im Rechtesystem

Eigentümer ändern
chown <login> <Datei|Verzeichnis>
chown -R <login> <Datei|Verzeichnis> (rekursiv)

Das darf aber nur root!


rechte 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–27
Änderungen im Rechtesystem

Eigentümer ändern
chown <login> <Datei|Verzeichnis>
chown -R <login> <Datei|Verzeichnis> (rekursiv)

Das darf aber nur root!

Eigentümergruppe ändern
rechte 2018-11-13

chgrp <group> <Datei|Verzeichnis>


chgrp -R <group> <Datei|Verzeichnis> (rekursiv)

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–27
Access Control Lists (ACLs)
Aber geht’s nicht etwas feingranularer?
Mein Test Verzeichnis soll nur mein Übungspartner lesen können!
$ setfacl -R -m u:uh95nhbq:rX aclverzeichnis
$ setfac l -R -d -m u:uh95nhbq:rX aclverzeichnis

$ ls -l
drwxr-xr-x+ 1 bjoe.fiedler student 0 2009-10-
11 10:45 aclverzeichnis

$ getfacl aclverzeichnis
# file: aclverzeichnis
# owner: bjoe.fiedler
# group: student
user::rwx default:user::rwx default:mask::r-x
rechte 2018-11-13

user:uh95nhbq:r-x default:user:uh95nhbq:r-x
group::r-x default:group::r-x
other::r-x default:other::r-x

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–28
Access Control Lists (ACLs)
Aber geht’s nicht etwas feingranularer?
Mein Test Verzeichnis soll nur mein Übungspartner lesen können!
$ setfacl -R -m u:uh95nhbq:rX aclverzeichnis
$ setfac l -R -d -m u:uh95nhbq:rX aclverzeichnis

$ ls -l
drwxr-xr-x+ 1 bjoe.fiedler student 0 2009-10-
11 10:45 aclverzeichnis
$ man getfacl
$ getfacl aclverzeichnis
# file: aclverzeichnis
# owner: bjoe.fiedler
# group: student
user::rwx default:user::rwx default:mask::r-x
rechte 2018-11-13

user:uh95nhbq:r-x default:user:uh95nhbq:r-x
group::r-x default:group::r-x
other::r-x default:other::r-x

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.7 Rechteverwaltung im Dateisystem 3–28
Wie Interagiere ich mit dem Dateisystem?

Aus dem C Programm


open(), read(), write(), close(), rename()
lstat(), stat()
opendir(), readdir(), closedir()
creat(), mkdir(), link(), symlink()
rmdir(), unlink()
Offene Dateien als repräsentiert als Dateideskriptor

Von der Shell


cat, mv
ls
touch, mkdir, ln
03t-datei 2018-11-13

rmdir, rm

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.8 Dateisystem-Interaktion 3–29


Elementaroperationen auf Dateien

Dateien bearbeiten: open(2) /creat(2) , read(2) , write(2) , close(2)


int open(const char *path, int flags, mode_t
 öffnet bestehende Datei; gibt
mode); Dateideskriptor zurück

int creat(const char *path, mode_t mode); erzeugt Datei +


Verzeichniseintrag; gibt
Dateideskriptor zurück
ssize_t read(int fd, void *buf, size_t count); liest aus geöffneter Datei
(Deskriptor fd); gibt Anzahl der
gelesen Bytes zurück (0 bei
Dateiende)
ssize_t write(int fd, void *buf, size_t count); schreibt in geöffnete Datei
(Deskriptor fd); gibt Anzahl der
gelesen Bytes zurück (0 bei
Dateiende)
03t-datei 2018-11-13

int close(int fd); schließt geöffnete Datei


(Deskriptor fd)

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.9 Dateisystem interaktion aus C 3–30
Dateiinformationen auslesen

stat(2) /lstat(2) liefern Datei-Attribute aus dem Inode


Unterschiedliches Verhalten bei Symlinks:
stat(2) folgt Symlinks (rekursiv) und liefert Informationen übers Ziel
lstat(2) liefert Informationen über den Symlink selber
Funktions-Prototypen
int stat(const char *path, struct stat *buf);

int lstat(const char *path, struct stat *buf);

path: Dateiname
buf: Zeiger auf Puffer zum Speichern der Dateiinformationen
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.9 Dateisystem interaktion aus C 3–31
Dateiinformationen auslesen

stat(2) /lstat(2) liefern Datei-Attribute aus dem Inode


Unterschiedliches Verhalten bei Symlinks:
stat(2) folgt Symlinks (rekursiv) und liefert Informationen übers Ziel
lstat(2) liefert Informationen über den Symlink selber
Funktions-Prototypen
int stat(const char *path, struct stat *buf);

int lstat(const char *path, struct stat *buf);

path: Dateiname
buf: Zeiger auf Puffer zum Speichern der Dateiinformationen
Für uns relevante Strukturkomponenten der struct stat:
03t-datei 2018-11-13

mode_t st_mode: Dateimode, u. a. Zugriffs-Bits und Dateityp


Zur Bestimmung des Dateitypes gibt es u. a. folgende Makros (inode(7) ):
S_ISREG, S_ISDIR, S_ISLNK

off_t st_size: Dateigröße in Bytes


© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.9 Dateisystem interaktion aus C 3–31
Dateiinformationen auslesen(Forts.)

Attribute auflisten (inode auslesen): lstat(2)


int lstat(const char *pathname, struct stat *buf); liest Attribute
(inode-Daten)
struct stat { Ergebnis von
dev_t st_dev; // device ID containing file lstat(2) : inode-
ino_t st_ino; // inode number
Datenstruktur des
mode_t st_mode; // protection
nlink_t st_nlink; // number of hard links Betriebssystems
uid_t st_uid; // user ID of owner (VFS)
gid_t st_gid; // group ID of owner
dev_t st_rdev; // device ID (if special file)
off_t st_size; // total size, in bytes
blksize_t st_blksize; // blocksize for filesystem IO
blkcnt_t st_blocks; // number of blocks allocated
struct timespec st_atim; // time of last access
struct timespec st_mtim; // time of last modification
struct timespec st_ctim; // time of last status change
};
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.9 Dateisystem interaktion aus C 3–32
Elementaroperationen auf Verzeichnisse

Verzeichnis auflisten: opendir(3) , readdir(3) , closedir(3)


DIR *opendir(const char *name); öffnet ein Verzeichnis für readdir(3)

struct dirent *readdir(DIR *dirp); liest nächsten Verzeichniseintrag; gibt NULL


zurück, falls am Ende angekommen
int closedir(DIR *dirp); schließt das mit opendir(3) geöffnete
Verzeichnis
struct dirent { Verzeichniseintrag kann weitere Elemente
ino_t d_ino; // inode number beinhalten, aber nur d_ino und d_name sind in
...
POSIX spezifiziert
char d_name[256]; // filename
};

#include <stdio.h> Beispiel:


#include <dirent.h>
Auflisten aller Namen
03t-datei 2018-11-13

int main() { im aktuellen


DIR* dir = opendir( "." ); // öffne aktuelles Verzeichnis
struct dirent* e = NULL; Verzeichnis.
while( (e = readdir(dir)) ) // lese nächsten Eintrag bis NULL
printf("%s\n", e->d_name); // gebe ihn aus
closedir( dir ); // schließe Verzeichnis
return 0;
}

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.9 Dateisystem interaktion aus C 3–33
Verzeichnisinhalte auslesen

DIR *opendir(const char *dirname);


struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);

Die DIR-Struktur ist ein Iterator und speichert die jeweils aktuelle Position
03t-datei 2018-11-13

opendir

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.9 Dateisystem interaktion aus C 3–34
Verzeichnisinhalte auslesen

DIR *opendir(const char *dirname);


struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);

Die DIR-Struktur ist ein Iterator und speichert die jeweils aktuelle Position
readdir(3) liefert einen Verzeichniseintrag und setzt den DIR-Iterator auf
den Folgeeintrag
03t-datei 2018-11-13

opendir e = readdir

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.9 Dateisystem interaktion aus C 3–34
Verzeichnisinhalte auslesen

DIR *opendir(const char *dirname);


struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);

Die DIR-Struktur ist ein Iterator und speichert die jeweils aktuelle Position
readdir(3) liefert einen Verzeichniseintrag und setzt den DIR-Iterator auf
den Folgeeintrag
Rückgabewert NULL im Fehlerfall oder wenn EOF erreicht wurde
bei EOF bleibt errno unverändert, im Fehlerfall wird errno entsprechend gesetzt
03t-datei 2018-11-13

opendir e = readdir e == NULL?

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.9 Dateisystem interaktion aus C 3–34
Verzeichnisinhalte auslesen

DIR *opendir(const char *dirname);


struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);

Die DIR-Struktur ist ein Iterator und speichert die jeweils aktuelle Position
readdir(3) liefert einen Verzeichniseintrag und setzt den DIR-Iterator auf
den Folgeeintrag
Rückgabewert NULL im Fehlerfall oder wenn EOF erreicht wurde
bei EOF bleibt errno unverändert, im Fehlerfall wird errno entsprechend gesetzt

Eintrag e
nein
bearbeiten
03t-datei 2018-11-13

opendir e = readdir e == NULL?

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.9 Dateisystem interaktion aus C 3–34
Verzeichnisinhalte auslesen

DIR *opendir(const char *dirname);


struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);

Die DIR-Struktur ist ein Iterator und speichert die jeweils aktuelle Position
readdir(3) liefert einen Verzeichniseintrag und setzt den DIR-Iterator auf
den Folgeeintrag
Rückgabewert NULL im Fehlerfall oder wenn EOF erreicht wurde
bei EOF bleibt errno unverändert, im Fehlerfall wird errno entsprechend gesetzt
closedir(3) gibt die belegten Ressourcen nach Ende der Bearbeitung frei

Eintrag e
nein
bearbeiten
03t-datei 2018-11-13

ja
opendir e = readdir e == NULL? closedir

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.9 Dateisystem interaktion aus C 3–34
Diskussion der Schnittstelle von readdir(3)

Der Speicher für die zurückgelieferte struct dirent wird von den
Bibliotheksfunktionen selbst angelegt und beim nächsten readdir-Aufruf
auf dem gleichen DIR-Iterator potentiell wieder verwendet!
werden Daten aus der dirent-Struktur länger benötigt, müssen sie vor dem
nächsten readdir-Aufruf kopiert werden
Konzeptionell schlecht
aufrufende Funktion arbeitet mit Zeiger auf internen Speicher der
readdir-Funktion
In nebenläufigen Programmen nur bedingt einsetzbar
man weiß evtl. nicht, wann der nächste readdir-Aufruf stattfindet
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.9 Dateisystem interaktion aus C 3–35
Vergleich: readdir(3) und stat(2)

Die problematische Rückgabe auf funktionsinternen Speicher wie bei


readdir(3) gibt es bei stat(2) nicht
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.9 Dateisystem interaktion aus C 3–36
Vergleich: readdir(3) und stat(2)

Die problematische Rückgabe auf funktionsinternen Speicher wie bei


readdir(3) gibt es bei stat(2) nicht
Grund: stat(2) ist ein Systemaufruf – Vorgehensweise wie bei readdir(3) wäre
gar nicht möglich
Vergleiche Vorlesung 2-8
readdir(3) ist komplett auf Ebene 3 implementiert (Teil der
Standard-C-Bibliothek/Laufzeitbibliothek)
stat(2) ist (nur) ein Systemaufruf(-stumpf), die Funktion selbst ist Teil des
Betriebssystems (Ebene 2)
03t-datei 2018-11-13

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.9 Dateisystem interaktion aus C 3–36
Vergleich: readdir(3) und stat(2)

Die problematische Rückgabe auf funktionsinternen Speicher wie bei


readdir(3) gibt es bei stat(2) nicht
Grund: stat(2) ist ein Systemaufruf – Vorgehensweise wie bei readdir(3) wäre
gar nicht möglich
Vergleiche Vorlesung 2-8
readdir(3) ist komplett auf Ebene 3 implementiert (Teil der
Standard-C-Bibliothek/Laufzeitbibliothek)
stat(2) ist (nur) ein Systemaufruf(-stumpf), die Funktion selbst ist Teil des
Betriebssystems (Ebene 2)
der logische Adressraum auf Ebene 3 (Anwendungsprogramm) ist nur eine
Teilmenge (oder sogar komplett disjunkt) von dem logischen Adressraum auf
Ebene 2 (Betriebssystemkern)
03t-datei 2018-11-13

Betriebssystemspeicher ist für Anwendung nicht sichtbar/zugreifbar


Funktionen der Ebene 2 können keine Zeiger auf ihre internen Datenstrukturen
an Ebene 3 zurückgeben

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.9 Dateisystem interaktion aus C 3–36
Anzeige von Textdateien

Zum Anzeigen von Textdateien gibt es den Befehl cat.

Typische Verwendung
cat <Datei>

$ cat elementare-befehle.tex
\begin{frame}
\frametitle{manpages -- das Hilfesystem unter Unix}
...
cat-less 2018-09-18

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.10 Dateisystem interaktion aus der Shell 3–37
Anzeige von Textdateien (2)

Hilfe, so schnell kann ich nicht lesen!


Wie kann ich die Anzeige verlangsamen?
cat gibt eingelesene Datei komplett aus, egal wie groß diese ist.
Seitenweise Anzeige: less.

Typische Verwendung
less <Datei>

Achtung!
cat und less können nur Textdateien sinnvoll anzeigen.
cat-less 2018-09-18

Falls nach der Ausgabe einer Binärdatei nur noch seltsame Zeichen
dargestellt werden, hilft der Befehl reset.

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.10 Dateisystem interaktion aus der Shell 3–38
rm – Löschen

rm
rm löscht Dateien und Verzeichnisse

Beispiele
rm foo.pdf – löscht die Datei ’foo.pdf’
rm -r Mails/ – löscht das Verzeichnis ’Mails’ und alle darin
enthaltenen Dateien und Unterverzeichnisse
rm -rf wichtig/ – löscht das Verzeichnis ’wichtig’ mit allen darin
enthaltenen Dateien und Unterverzeichnissen,
ohne nachzufragen – auch falls diese
schreibgeschützt sind!
loeschen 2018-09-18

Achtung!
rm löscht ohne Nachfrage und ohne Umweg über den Papierkorb!

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.10 Dateisystem interaktion aus der Shell 3–39
mkdir, rmdir – Verzeichnisse erstellen und entfernen

mkdir
mkdir foo legt ein Verzeichnis ’foo’ im aktuellen Verzeichnis an

rmdir
rmdir foo löscht das Verzeichnis ’foo’ aus dem aktuellen Verzeichnis
(’foo’ muss leer sein)
loeschen 2018-09-18

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.10 Dateisystem interaktion aus der Shell 3–40
mv – Verschieben

Aufbau
mv <Quelle> <Ziel>

Beispiele
mv alt neu – benennt die Datei ’alt’ in ’neu’ um
(geht auch für Verzeichnisse)
mv foo dinge/ – verschiebt die Datei ’foo’ aus dem aktuellen
Verzeichnis in das Verzeichnis ’dinge’
mv 2018-09-18

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.10 Dateisystem interaktion aus der Shell 3–41
cp – Kopieren

Aufbau
cp <Quelle> <Ziel>

Beispiele
cp bsp bspkopie – kopiert die Datei ’bsp’ nach ’bspkopie’
(im aktuellen Verzeichnis)
cp bsp test/ – kopiert die Datei ’bsp’ in das Verzeichnis
’test’
cp -v bsp test/ – …mit Ausgabe der einzelnen
Kopieraktionen
cp -a test/ test2 – erstellt eine Kopie des Verzeichnisses
’test’ mit dem Namen ’test2’
mv 2018-09-18

cp -a /verz . – erstellt eine Kopie des Verzeichnisses


’/verz’ im aktuellen Verzeichnis

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.10 Dateisystem interaktion aus der Shell 3–42
find – Suche nach Dateien

Rekursive Dateisuche in Verzeichnisstrukturen nach bestimmten Kriterien.

Aufruf
$ find [dir] <filter1> <filter2> ...

Häufig benutzte Filter:


-name, -iname sucht mit Wildcards nach Dateinamen,
mit i case-insensitive (Groß-/Kleinschreibung egal)
-type [f|d] sucht nur nach bestimmten Dateityp, f für Files,
d für Directories
find 2018-09-18

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.10 Dateisystem interaktion aus der Shell 3–43
find – Suche nach Dateien

$ find . -name '*.pdf'


./AuD/uebungen/blatt01.pdf
./studbesch_ws1314.pdf

$ find Musik/ -iname '*.mp3'


./Musik/Deep_Purple/Made_in_Japan/Highwaystar.MP3
find 2018-09-18

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.10 Dateisystem interaktion aus der Shell 3–44
grep – Suchen in Dateien
Sucht in der Standard-Eingabe (stdin) oder in Dateien nach Zeilen, die auf
einen regulären Ausdruck passen, und gibt passende Zeilen auf der
Standard-Ausgabe (stdout) aus.
Der einfachste reguläre Ausdruck umfasst nur das Suchwort selbst.
Aufruf
grep <pattern> [file1 file2 ...]

$ grep ssh /etc/services


ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp

Tipp
grep 2018-09-18

grep -i <pattern>
Option -i zum Suchen ohne Beachtung der Groß-/Kleinschreibung.

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.10 Dateisystem interaktion aus der Shell 3–45
sort – Sortieren

Sortiert die Standard-Eingabe (stdin) und gibt die sortierte Liste auf der
Standard-Ausgabe (stdout) aus.
Aufruf
sort [options] < infile
<andererbefehl> | sort [options]

Häufig benutzte Optionen:


-r Sortiert in umgekehrter Reihenfolge
-n Sortiert numerisch statt alphabetisch
-u Entfernt duplikate aus der Ausgabe
sort 2018-09-18

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.10 Dateisystem interaktion aus der Shell 3–46
uniq – Nur Unikate

uniq fasst aufeinander folgende gleiche Zeilen zusammen.


input.txt
foo
bar
bar
baz
foo

$ uniq < input.txt $ sort < input.txt | uniq


foo bar
bar baz
baz foo
uniq 2018-09-18

foo

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.10 Dateisystem interaktion aus der Shell 3–47
cut – Spalten ausschneiden

Filtert bestimmte Spalten aus der Standard-Eingabe (stdin) und gibt sie
auf der Standard-Ausgabe (stdout) aus.
Aufruf
cut [-d <delimiter>] -f <fields>

delimiter ist ein einzelnes Zeichen das zur Trennung der Spalten
benutzt wird. Standardwert ist TAB.
fields bezeichnet welche Spalten ausgegeben werden sollen,
separiert durch Komma (1,2,3) oder Bereiche (1-3).
cut 2018-09-18

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.10 Dateisystem interaktion aus der Shell 3–48
cut – Spalten ausschneiden

$ head -n3 < /etc/passwd


root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh

$ cut -d: -f 1,5 < /etc/passwd | head -n3


root:root
daemon:daemon
bin:bin
cut 2018-09-18

© dl,bf GBS (WS 18) 3 Tafelübung 3: Dateisystem | 3.10 Dateisystem interaktion aus der Shell 3–49

Das könnte Ihnen auch gefallen