logoOL.gif
user_gelb_schwarz_or.gif
logoUL.gif
logoUR.gif claim.gif
LinuxUser LinuxCommunity EasyLinux Linux-Magazin International
      Anzeige
      Anzeige

Erschienen in LinuxUser 04/2000

Zu Befehl

Hin- und hergeschoben

von Heike Jurzik
 [ Titelbild ]


Auch wenn sich viele Dinge bequem über grafische Oberflächen wie KDE oder GNOME regeln lassen -- wer sein Linux-System richtig ausreizen möchte, kommt um die Kommandozeile nicht herum. Abgesehen davon gibt es auch sonst viele Situationen, wo es gut ist, sich im Befehlszeilen-Dschungel ein wenig auszukennen.

Nein, um Sokoban oder Kistenschieben geht es in dieser Folge nicht -- eher darum, wie man Dateien an andere Stellen kopiert oder verschiebt. Eigentlich sieht das auf den ersten Blick ganz einfach aus, aber bei genauem Hinsehen geschehen doch manchmal recht ungewöhnliche Dinge. Was passiert, wenn man einen symbolischen Link kopiert? Wie bleiben möglichst viele Eigenschaften einer Datei beim Kopieren erhalten? Und wie funktioniert denn das Ganze mit Unterverzeichnissen?


Sokoban: Dieser Strategiespielklassiker existiert selbstverständlich auch für Linux in verschiedenen Varianten, z.B. als Netzwerkspiel XSoko ( http://www.mindspring.com/~lewca43/xsoko/) oder in der traditionellen Form als Bestandteil des KDE-Games-Pakets (ksokoban).
Symbolischer Link: Ein Verweis auf eine andere Datei, der von Anwendungsprogrammen wie eben diese Datei behandelt wird. Wenn die Datei, auf die ein Symlink verweist, gelöscht wird, zeigt der Link ins Leere. Symlinks sind das Ergebnis des Kommandos ln -s.

Original oder Fälschung?

Der Befehl cp (vom englischen "copy" abgeleitet) erzeugt eine neue Datei mit dem Inhalt der Ausgangsdatei, wobei diese unverändert bleibt. Sollte datei2 schon existieren, wird diese einfach überschrieben. Wie schafft man bei so etwas Abhilfe? Schließlich möchte man nicht einfach aus Versehen wichtige Dinge verlieren... Die Lösung lautet
huhn@huehnerstall ~ > cp -i datei1 datei2
cp: overwrite `datei2'?
Jede Antwort des Benutzers, die mit einem y oder Y beginnt, wird als Bestätigung interpretiert -- alles andere heißt "nein". Die Option -i darf auch --interactive ausgeschrieben werden. Fast alle GNU-Implementationen der Unix-Standardkommandos haben neben den gängigen Kurzformen noch eine mit zwei Bindestrichen eingeleitete lange, "sprechende" Bezeichnung.


GNU: Das GNU-Projekt setzte sich zum Ziel, ein freies Unix-artiges Betriebssystem zu schaffen und begann damit, all die Kommandozeilenbefehle zu implementieren, die man zum sinnvollen Arbeiten braucht. Zusammen mit dem Linux-Betriebssystemkern (dem "Kernel") bilden diese GNU-Utilities die Grundlage aller Linux-Distributionen, man setzt sie aber auch gern mit anderen Betriebssystemen ein. Das rekursive ("selbstbezügliche") Akronym GNU steht übrigens für "GNU is not UNIX" und distanziert sich damit vom Ur-UNIX von AT&T.

So eine Sicherheitsabfrage ist schön; vorsichtige Menschen setzen sich ein Alias. Für die Linux-Standardshell bash würde der Eintrag in der privaten Konfigurationsdatei .bashrc aus dem Homeverzeichnis so aussehen:

alias cp='cp -i'


Alias: Um ein Programm (mit seinen Optionen) unter einem anderen, kürzeren oder prägnanteren Namen aufrufen zu können, gibt es die Möglichkeit, mit dem Befehl alias eine "Abkürzung" zu definieren: alias cp='cp -i'. Dauerhaft wird diese allerdings erst, wenn man sie in die Konfigurationsdatei der eigenen Shell schreibt (siehe Text).

Wie bei allen Standardkommandos, die man auf diese Weise neu definiert, sollte man auch hier Vorsicht walten lassen: Hat man sich einmal an die Sicherheitsabfrage gewöhnt, kann man leicht ins Schleudern kommen, wenn es den schützenden Alias auf einem anderen System oder unter einem anderen Account nicht gibt.

Noch mehr Sicherheit bietet der Parameter -b (--backup). Ist die Zieldatei bereits vorhanden, wird automatisch eine Sicherungskopie angelegt. Diese kann man an der Tilde erkennen: datei2~.

Was passiert aber, wenn man keine "normalen" Dateien, sondern einen Symlink kopiert? Die Referenz vom Link auf die Datei wird hierbei aufgelöst. Im Klartext heißt das: Kopiert wird die Datei, auf die der Link zeigt. Möchte man stattdessen einen neuen Link erzeugen, greift man zur Option -d (--no-dereference).

Es ist auch möglich, mehrere Dateien in ein Zielverzeichnis zu kopieren. Dazu hängt man einfach die Dateinamen hintereinander: cp datei1 datei2 datei3 verzeichnis. Manchmal geht es jedoch nicht nur um einzelne Dateien, sondern um ganze Verzeichnisse mit sämtlichen Dateien und Unterverzeichnissen. Ein einfaches cp verzeichnis zielverzeichnis liefert nur die Fehlermeldung cp: verzeichnis: omitting directory. Setzt man hinter den Befehl den Parameter -R (für --recursive), wird das ganze Verzeichnis rekursiv (also mit allen Dateien bis in den letzten Winkel eventuell enthaltener Unterverzeichnisse) dupliziert.

Hinter den Kulissen

Standardmäßig wird die beim Kopieren entstehende neue Datei mit owner und group des kopierenden Benutzers angelegt und erhält einen aktuellen timestamp. Ihre Rechte richten sich nach der gesetzten umask. Um stattdessen möglichst viele Eigenschaften der Originaldatei zu übernehmen, verwendet man die Option -p (--preserve). Hier werden auf jeden Fall Zugriffsrechte und Zeitstempel der Ursprungsdatei übernommen.


owner: Der Eigentümer einer Datei, also der Benutzer, dem sie gehört.
group: Benutzer werden in Gruppen verwaltet, analog gehört also auch jede Datei einer Gruppe. Die Zugriffsrechte der Gruppe und des Besitzers auf diese Datei regelt man über die permissions.
permissions: Die Zugriffrechte auf eine Datei gliedern sich in die Rechte des Besitzers, der Gruppe und aller sonstigen Benutzer auf, wobei jeweils Rechte für das Lesen (r), das Schreiben (w) und das Ausführen (x) vergeben werden.
timestamp: Unix-Dateisysteme verwalten für eine Datei verschiedene Datumseinträge, z.B. die Zeit des letzten Zugriffs oder der letzten Änderung. Gerade für Backups oder Sicherungskopien ist es wichtig, den Zeitstempel der Originalzeit (z.B. den der letzten Modifikation) zu behalten, bevor man vielleicht ein falsches File weiter bearbeitet.
umask: Beeinflusst die Rechte, mit denen neue Dateien erzeugt werden: Die umask gibt an, welche Zugriffsrechte auf keinen Fall gesetzt werden sollen, wenn eine neue Datei erzeugt wird. Als Eselsbrücke nimmt man an, dass bestimmte Dateien hypothetisch im Modus 777 (also mit allen Rechte für jeden), Textdateien hingegen mit dem Modus 666 (für jeden Lese- und Schreibrecht) angelegt werden. Wenn eine Datei neu geschrieben wird, wird vom entsprechenden Modus der umask-Wert gewissermaßen abgezogen. Diese "User-Maske" setzt man mit dem Kommando umask wert, z.B. umask 022 (022 ist der Standardwert, der meistens eingestellt ist). Wird jetzt eine Textdatei erzeugt, bekommt sie die Rechte der Differenz 666 - 022 verliehen, also 644 (-rw-r--r--). Das Kommando umask ohne Argument liefert den augenblicklichen umask-Wert.

Allerdings kann nur root fremdes Dateieigentum "verschenken" oder dem Verzeichnis eines bestimmten Benutzers Dateien unterjubeln, die einem anderen gehören. Nur bei rootschen Kopieraktionen mit -p gehört die neue Datei demnach demselben User wie das Original. Kopiert man als gewöhnlicher User, geht die Kopie in eigenes Eigentum über. Anderenfalls könnte ja jeder anderen eine veränderte Datei als Kuckucksei unterschieben!

Doch wofür genau braucht man diese Option dann überhaupt? Um Administratorinnen Arbeit zu ersparen: Als Systemverwalter möchte man oft User-Verzeichnisse sichern. Müsste man jedesmal nach dem Kopieren wieder Rechte und Gruppenzugehörigkeit ändern, wäre das ganz schön viel Aufwand.

Zeit für den Frühjahrsputz -- oder: Wie räume ich mein /home auf?

Mit der Zeit sammeln sich im eigenen Homeverzeichnis jede Menge einsame Dateien an. Damit man nicht in einem unübersichtlichen Chaos dauernd nach etwas suchen muss, legt man sich am besten Unterverzeichnisse an (mkdir neuesverzeichnis) und sortiert die Files. Hier kommt das Kommando mv (wie englisch "move") ins Spiel. Mit mv datei verzeichnis wird die angegebene datei in das entsprechende verzeichnis bewegt. Auch hier gibt es wie bei cp die Option -i (für --interactive). Liegt im Ziel-Directory bereits eine Datei mit gleichem Namen, wird eine Warnung ausgegeben:
huhn@huehnerstall ~ > mv -i datei verzeichnis
mv: replace `verzeichnis/datei'?
Man kann mv auch dazu verwenden, eine Datei umzubenennen. Gibt es wie im Beispiel oben schon ein File mit dem Namen datei in verzeichnis, kann man dieses mit mv datei datei1 zunächst aus dem Weg räumen.

Selbstverständlich lassen sich auch ganze Verzeichnisse verschieben. Vorsicht ist allerdings beim Versuch geboten, ein Verzeichnis auf eine andere Partition zu bewegen:

 
huhn@huehnerstall ~ > mv verzeichnis /dos/d/tmp
mv: cannot move `verzeichnis' across filesystems: Not a regular file
Nur "normale" Dateien lassen sich in ein anderes Dateisystem bewegen. Das liegt daran, dass jeder Aufruf von mv innerhalb desselben Dateisystems nur ein Umbenennen der Datei bewirkt, auch wenn sie in einem anderen Verzeichnis abgelegt wird. Nur wenn das File in ein anderes Dateisystem verschoben wird, werden wirklich Daten bewegt. Und das klappt weder mit Verzeichnissen noch mit symbolischen Links.


Dateisystem: Die Organisationsstruktur von Dateien und Verzeichnissen auf einer formatierten Festplattenpartition o.a. Datenträgern. Linux unterstützt sehr viele Arten von Dateisystemen, neben den "eigenen" wie ext2 auch "fremde" z.B. von DOS oder Win9x (msdos, vfat). Die hier erwähnten Dateisysteme können keine partitions- bzw. datenträgerübergreifenden Strukturen aufbauen, sodass das jeweilige Dateisystem am Ende der physikalischen Einheit aufhört.

Ich will Backups!

Ebenso wie cp kennt mv die Option -b (--backup). Hier gibt es noch mehr interessante Features zu entdecken. So kann man beispielsweise nicht nur das Backup-Suffix (Standard ist die Tilde ~) verändern, sondern auch die Sicherungskopien durchnummerieren lassen.
huhn@huehnerstall ~ > touch neuedatei
huhn@huehnerstall ~ > mv -b -V t datei1 neuedatei
huhn@huehnerstall ~ > mv -b -V t datei2 neuedatei
huhn@huehnerstall ~ > ls 
neuedatei.~1~
neuedatei.~2~
Hier steht -V für --version-control und das t für durchnummerierte Backups. Interessant wird die ganze Sache, wenn man sich diese Optionen als Umgebungsvariablen setzt. Für das Standard-"Anhängsel" an Sicherungskopien definiert man dazu SIMPLE_BACKUP_SUFFIX, für die Kontrolle von mehreren Kopien VERSION_CONTROL.

Damit gestaltet man sein "Wunsch"-Suffix für die bash so:

huhn@huehnerstall ~ > export SIMPLE_BACKUP_SUFFIX="-backup"
Zur Kontrolle legen wir eine leere Datei an, die wir testweise mit mv -b verschieben:
huhn@huehnerstall ~ > touch neuedatei
huhn@huehnerstall ~ > mv -b datei1 neuedatei
huhn@huehnerstall ~ > ls
neuedatei
neuedatei-backup
Möchte man stattdessen mehrere, durchnummerierte Sicherungskopien aufbewahren, tippt man export VERSION_CONTROL=t. Vorsicht: Das gesetzte SIMPLE_BACKUP_SUFFIX kommt jetzt nicht mehr zum Einsatz! Bei einem mv -b datei1 neuedatei würde jetzt wieder durchnummeriert. Eine Variable wird man in der bash übrigens mit dem Kommando unset wieder los, im vorliegenden Fall also mit unset VERSION_CONTROL.

Und um den Frühjahrsputz im /home komplett zu machen, lesen Sie in der nächsten "Zu-Befehl"-Folge, wie man mit dem Kommando rm die ganzen "Backupleichen" in den Datenkeller räumt. (pju)

Copyright © 2000 Linux-Magazin-Verlag

Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links" nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedruckten Fassung entsprechen.

Seite drucken | Feedback zu dieser Seite | Datenschutz | © 2019 COMPUTEC MEDIA GmbH

Nutzungsbasierte Onlinewerbung

[Linux-Magazin] [EasyLinux] [Linux-Community]