\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{ngerman}
%\usepackage{hyperref}
%\usepackage{graphicx}
\usepackage{geometry}
\geometry{a4paper, left=25mm, top=10mm}
\title{Workstation Linuxkurs}
\author{Paul Hänsch}

\begin{document}
\maketitle

\section{Tag 3}

\subsection{Arbeit mit Dateien, Verzeichnissen und Pfaden}
An den vorherigen Tagen haben wir folgende Befehle Kennengelernt:
\begin{itemize}
  \item \textbf{Tag 1}
  \subitem \textbf{touch} legt eine Datei an
  \subitem \textbf{ls} zeigt Dateien und Verzeichnissen an
  \subitem \textbf{echo} gibt einen Text aus
  \subitem \textbf{cat} gibt den Inhalt einer Datei aus
  \subitem \textbf{chmod} ändert den Zugriffsmodus (Zugriffsrechte) auf einer Datei
  \subitem \textbf{groups} zeigt an, in welchen Gruppen ein Benutzer Mitglied ist
  \subitem \textbf{chgrp} ändert die Gruppenzuweisung einer Datei
  \item \textbf{Tag 2}
  \subitem \textbf{pwd} um anzuzeigen, in welchem Verzeichnis wir aktuell arbeiten
  \subitem \textbf{cd} um uns in ein anderes Arbeitsverzeichnis zu bringen
  \subitem \textbf{mkdir} um ein Verzeichnis zu erstellen
\end{itemize}

Die Kommandozeile bietet noch sehr viel mehr Befehle, einige davon sollen hier vorgestellt werden.
\begin{itemize}
  \item \textbf{rm} - ``remove'' (entfernen) löscht die angegebenen Dateien
  \item \textbf{rmdir} - ``remove directory'' (Verzeichnis entfernen) löscht die angegebenen (leeren) Verzeichnisse
  \item \textbf{cp} - ``copy'' (kopiere) kopiert die angegebenen Dateien in ein angegebenes Verzeichnis\\
    oder: kopiert eine angegebene Datei zu einer anderen Datei
  \item \textbf{mv} - ``move'' (verschiebe) verschiebt die angegebenen Dateien in ein angegebenes Verzeichnis\\
    oder: verschiebt eine angegebene Datei zu einer anderen Datei (d.h. \textbf{benennt die Datei um})
\end{itemize}

Zur Übung legen wir ein paar Dateien an, und entfernen sie wieder:\\
\verb#touch foo bar qua#\\
\verb#ls#\\
$\Rightarrow$\\
\verb#bar foo qua ...#\\
\\
\verb#rm foo bar qua#\\
\verb#ls#\\
$\Rightarrow$\\
\verb#...#\\

Das gleich jetzt mit Verzeichnissen:\\
\verb#mkdir quux baz#\\
\verb#ls#\\
$\Rightarrow$\\
\verb#baz quux ...#\\
\\
\verb#rmdir quux baz#\\
\verb#ls#\\
$\Rightarrow$\\
\verb#...#\\

Das war einfach. Was passiert aber nun, wenn wir versuchen ein Verzeichnis zu löschen, in dem schon etwas drin ist?\\
\verb#mkdir test#\\
\verb#touch test/datei#\\
\verb#rmdir test#\\
$\Rightarrow$\\
\verb#rmdir: failed to remove `test': Directory not empty#\\

``daran gescheitert 'test' zu entfernen: Verzeichnis nicht leer''. Das zeigt uns, dass rmdir nur leere Verzeichnisse löschen kann. Was ist aber, wenn wir ein Verzeichnis, mit vielen Unterverzeichnissen und -dateien entfernen wollen? Müssen wir dann jedes untergeordnete Objekt einzeln löschen? Naturlich nicht! Das Kommando '\verb#rm#' bietet mit dem Parameter 'r' die Möglichkeit zum sogenannten ``rekursiven'' Löschen:\\
\verb#rm -r test#\\
\verb#ls#\\
$\Rightarrow$\\
\verb#...#\\

Das Verzeichnis samt Inhalt wurde gelöscht und zwar unabhängig davon, wie komlex die untergeordnete Struktur war. Um das zu tun schaut \verb#rm# in jedem Verzeichnis nach Unterverzeichnissen und dateien  und in jedem Unterverzeichnis wiederum nach Unterverzeichnissen und Dateien um diese zu löschen. Ein solches Vorgehen bezeichnet man als ``Rekursion''.\\

Wir kenne bereits das Kommando '\verb#ls#'. Dieses besitzt ebenfalls einen 'R'-Parameter zur ``rekursiven Auflistung'' von Verzeichnissen (hier ist es jedoch ein großes 'R', nicht klein 'r'):\\
\verb#ls -R /etc#\\
$\Rightarrow$\\
...\\

Auf den Abdruck der Befehlsausgabe wird hier verständlicherweise wieder verzichtet. Der Befehl listet den gesamten Inhalt von '/etc' auf, danach den Inhalt aller Unterverzeichnisse und der Unterverzeichnisse davon, Eines nach dem Anderen.\\

Das kopieren von Dateien ist einfach:\\
\verb#mkdir Testverzeichnis#\\
\verb#touch datei1 datei2 datei3#\\
\verb#cp datei1 datei2 datei3 Testverzeichnis/#\\
\verb#ls Testverzeichnis#\\
$\Rightarrow$\\
\verb#datei1 datei2 datei3#\\

An den Befehl \verb#cp# wurden hier 4 Objekte übergeben. Das Programm hat einfach alle gelisteten Dateien in das Ziel kopiert. Als Kopierziel wurde das letzte ubergebene Objekt erkannt. Hätten wir als letztes eine Datei und kein Verzeichnis angegeben, so hätte '\verb#cp#' sich darüber beschwert.\\

Der Befehl '\verb#mv#' funktioniert genau so. Abgesehen davon natürlich, dass er Dateien verschiebt, statt sie zu kopieren.\\
$\rightarrow$ selbst ausprobieren!\\

\end{document}
