Shell-Workshop (2)

Status
Für weitere Antworten geschlossen.

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
In diesem Workshop geht es zum ersten Mal um Dateien.

Je nach verwendetem Dateisystem (ext3, ext4 usw.) werden Daten etwas unterschiedlich auf den Speichermedien (Platten) abgelegt. Das Dateisystem ist dazu da, Dateien und Verzeichnisse so zu organisieren, dass man als Shell-User nichts davon mitbekommt, wie es physikalisch organisiert wird.

Alle Dateien lassen sich in Form eines sequentiellen Datenstrom (byte-stream) benutzen. Aus der Shell heraus, kann man Dateien lesen und (über-)schreiben oder neue Daten ans Dateiende anhängen. Zugriffe auf Teile einer Datei sind nur mit speziellen Tools (dd) oder Programmen möglich. Auch das Ändern einer Datei per Editor muss man sich eher so vorstellen, dass die Datei komplett ins RAM gelesen wird und dann im RAM geändert werden kann. Beim Zurückschreiben wird im Grunde die komplette Datei ersetzt (und nicht eventuell nur Teile davon).

Eine Datei besteht aus zwei Bereichen: der inode (sprich: Ei-Nood), in der die einfachen Dateiattribute stehen, Zugriffs- und Änderungszeit protokolliert wird und Verweise auf die Dateibereiche enthalten sind. inodes haben keine Namen, sondern sind durchnummeriert. Kennt man also die inode-Nummer einer Datei, dann ist es kein Problem auch an die Daten heranzukommen. Nun ist das Merken einer Nummer nicht gerade ein einfaches Mittel um eine riesengroße Anzahl von Dateien zu verwalten.

Damit man auch bei einer großen Anzahl von Dateien eine gewisse Übersicht behalten kann, gibt es Verzeichnisse (directories), die man hierarchisch organisieren kann. In einem Verzeichnis steht der Dateiname (und nur im Verzeichnis, nicht in der inode) und die inoden-Nummer. So ist es auch denkbar, dass verschiedene Dateinamen auf die gleich inoden-Nummer verweisen ... das wäre der klassiche Hardlink (aber dazu kommen wir noch später). Alle Platten/Partitionen mit Dateisystemen werden durch Mounten (Binden) in ein großes Dateisystem integriert. Es gibt also normalerweise keine Möglichkeit, gezielt auf einzelne Platten oder Partition zuzugreifen. Das oberste Verzeichnis ist immer das Verzeichnis der Platte/Partition, die zum Booten auserkoren wurde. Es wird durch einen '/' repräsentiert und man nennt es das 'root'-Verzeichnis oder 'root'-directory.

Mit Kommandos wie mkdir (make directory) und rmdir (remove directory) kann man sich nun Hierarchien aufbauen oder wieder löschen. Directories sind wie normale Dateien zu benamen (die Regeln für die Länge und die gültigen Zeichen im Dateinamen werden je nach Dateisystem und Shell gebildet; meist sind 255-Byte lange Dateinamen möglich ... aber Vorsicht, wenn man mit japanischen Zeichen einen Dateinamen bastelt, mag es kürzer sein).

Als Trennzeichen zwischen Ebenen der Verzeichnishierarchie wird der '/' (slash) verwendet; das Gesamtgebilde nennt man 'Pfad' (path). Also Vorsicht, der '/' hat 2 Bedeutungen, wenn er am Anfang eines Pfades steht, bedeutet er 'root'-directory, wenn er in der Mitte vorkommt, bedeutet er 'Pfadtrennzeichen' (slash).

Wie oben schon ausgeführt, sind Dateien wie sequentielle Datenströme zu verstehen. Der Hintergrund für dieses Verhalten liegt u. a. darin begründet, dass sich auch Geräte wie die Tastatur und der Bildschirm oder Drucker so Verhalten wie sequentielle Datenströme und dass man diese überall da, wo man auch mit Dateien arbeiten kann, benutzen kann.

Wenn wir also ganz schlicht Daten von der Tastatur in eine Datei transferieren wollen oder umgekehrt, sie uns am Bildschirm ansehen wollen, dann ist es nützlich, die Geräte (engl. device) per (Datei-)Namen verwenden zu können. Im Grunde ist das die Zurverfügungstellung der Leistungen eines Gerätetreibers. Alle Gerätenamen stehen im Verzeichnis '/dev' oder einem dortigen Unterverzeichnis. Um den Namen der Tastatur (Eingabe) und des Bildschirms (Ausgabe) herauszubekommen, gibt es das Kommando 'tty'.
Rich (BBCode):
Syno> tty
/dev/ttyp1

Kombiniert man nun diesen Gerätenamen mit einem Kopiertool wie dem 'cp' (copy), dann ergeben sich folgenden Möglichkeiten:

Rich (BBCode):
Syno> cp /dev/ttyp1 a1
abc<Strg-D>
Syno> cp a1 /dev/ttyp1
abc

Der 'cp' kennt 2 Parameter: der erste ist für die Eingabedatei, der zweite für die Ausgabedatei. <Strg-D> bedeutet 'EOF' oder 'End-of-File' oder die Taste 'Strg' kombiniert mit der Taste 'D' drücken. Natürlich ist der cp kein Editor; er liest einfach nur den Tastaturpuffer und kennt keine Editierfunktionalität.

In dem Beispiel wird eine Datei namens 'a1' im HOME-Verzeichnis des Benutzers 'root' angelegt. Anschauen kann man sich ein Verzeichnis mit 'ls' (list directory sorted). Mit 'rm' (remove) kann man die Datei wieder löschen.

Rich (BBCode):
Syno> ls
a1
Syno> rm a1
Syno> ls
Syno>

Wenn man nun ein Unterverzeichnis anlegen möchte und eine Datei dort hinein erfassen will, dann könnte man wie folgt vorgehen:

Rich (BBCode):
Syno> copy /dev/ttyp1 a1
abc<Strg-D>
Syno> ls
a1
Syno> mkdir unter1
Syno> cp a1 unter1/a2
Syno> ls
a1          unter1
Syno> ls unter1
a2

Mit 'mv' kann man Dateien verschieben bzw. umbennen. Mit 'cd' kann man in ein Unterverzeichnis wechseln, wobei man den Namen (oder Pfad) des Unterverzeichnisses angeben muss. Der Name '..' bedeutet, ich möchte in das hierarchisch höhere Verzeichnis. Der Name '.' bedeutet, ich möchte das aktuelle Verzeichnis verwenden (ist am Anfag schwer zu verstehen, wofür man das braucht; bei der Skriptausführung wird es dann wichtig).

Also weiter im Beispiel:

Rich (BBCode):
Syno> cd unter1
Syno> pwd
/root/unter1
Syno> ls
a2
Syno> mv a2 ../a2
Syno> ls
Syno> cd ..
Syno> pwd
/root
Syno> ls
a1          a2          unter1
Syno> rm a2
Syno> ls
a1          unter1
Syno> rmdir unter1
Syno> ls
a1
Syno>

=====
Alles klar? Dann einfach noch einmal mit etwas anderen Namen nach machen ...

Itari



=========================================
Sinnvollerweise sind die Shell-Workshops aufeinander aufgebaut.

Shell-Workshop (1)
Shell-Workshop (3)
 
Zuletzt bearbeitet:

Super-Grobi

Benutzer
Mitglied seit
28. Sep 2010
Beiträge
1.913
Punkte für Reaktionen
0
Punkte
62
Anmerkung
Rich (BBCode):
Syno> ls
a1          a2          unter1
Syno> rm a1
Syno> ls
a1          unter1
dürfte eigentlich
Rich (BBCode):
Syno> ls
a1          a2          unter1
Syno> rm a1
Syno> ls
a2          unter1
ergeben

==== Danke für die Korrektur - ich habe es ein wenig anders eingebaut, aber nun richtig. Itari
 
Zuletzt bearbeitet von einem Moderator:
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat