Erfahrene Linux-Nutzer schwören auf flexible Kommandozeilentools, mit denen sich manche Aufgabe schneller bewältigen lässt als in grafischen Programmen. Wir stellen die wichtigsten Anwendungen vor, um auch Einsteiger zu einem Ausflug in die Shell zu ermutigen.
Know-how für die Kommandozeile
Tipp: Aus Groß mach Klein: “mmv”
Wer oft Dateien zwischen Linux- und Windows-Systemen tauscht, stolpert über kurz oder lang über einen Mix aus Groß- und Kleinbuchstaben in den Dateinamen. Liegen auf dem Linux-Rechner beispielsweise zahlreiche Dateien in Großbuchstaben, die Sie alle lieber in Kleinschreibung sehen würden, müssen Sie nicht zum Dateimanager oder dem Kommando mv greifen und jede einzelne Datei umbenennen. Das Programm mmv (“multiple move”) aus dem gleichnamigen Paket bietet eine elegante Lösung für dieses Problem. So wird aus Groß Klein:
$ mmv -v "*" "#l1" DATEI1.HTM -> datei1.htm : done DATEI2.HTM -> datei2.htm : done …
In dem gezeigten Kommando sorgt der Parameter -v dafür, dass mmv anzeigt, was es gerade tut. Über das Sternchen im ersten Argument sprechen Sie alle Dateien im aktuellen Verzeichnis an. Dieser Ausdruck – ebenso wie der nächste – sollte in Anführungszeichen stehen, damit die Shell die Sonderzeichen nicht interpretiert. Im zweiten Ausdruck wird #1 genau durch den Teil des Dateinamens ersetzt, auf den das Sternchen passt, also in diesem Fall durch den vollständigen Dateinamen. Steht zwischen dem Rautezeichen und der Ziffer noch der Buchstabe l (englisch “lower case” = Kleinbuchstaben), wandelt mmv alle großen in kleine Buchstaben um.
Ebenso schnell geht es in die andere Richtung: Ersetzen Sie dazu l durch u (englisch “upper case” = Großbuchstaben), also zum Beispiel:
$ mmv -v "*" "#u1" datei1.htm -> DATEI1.HTM : done datei2.htm -> DATEI2.HTM : done
Tipp: Tabula rasa mit “rm” und “rmdir”
Der Befehl rm löscht Dateien und das Kommando rmdir Verzeichnisse – so weit, so gut. Ein Verzeichnis, das allerdings noch Dateien oder Unterverzeichnisse enthält, werden Sie so nicht los. Abhilfe schafft die Option -r (rekursiv), die Sie zusammen mit dem Namen des Ordners an rm (und nicht rmdir) übergeben:
$ rmdir test rmdir: test: Directory not empty $ rm -r test $
Manchmal weigert sich rm dennoch, etwas zu löschen, beispielsweise, wenn die Schreibrechte fehlen. Sie sehen dann eine Abfrage der Form:
rm: reguläre Datei »datei« entfernen?
Tippen Sie dann [J] oder [Y] gefolgt von [Eingabe], verrichtet rm die Arbeit ohne zu murren. Alternativ teilen Sie dem Löschbefehl schon beim Aufruf mit, dass Sie derartige Sicherheitsabfragen nicht wünschen: rm -f löscht auch solche Daten. Die beiden Aufrufoptionen sind auch kombinierbar, so dass rm -rf rekursiv und ohne Nachfrage löscht.
Tipp: Dateien mit Leer- und Sonderzeichen löschen
Einmal beim Abspeichern im Texteditor daneben gehauen, und schon ist es passiert: Auf einmal haben Sie eine Datei namens “-gack”. Während Sie ein solches Konstrukt problemlos über einen grafischen Dateimanager wie Nautilus oder Konqueror löschen können, verweigert rm auf der Shell zunächst scheinbar den Dienst:
$ rm -gack rm: Ungültige Option – g Versuchen Sie »rm ./-gack«, um die Datei »-gack« zu entfernen. »rm --help« gibt weitere Informationen.
Wegen des Bindestrichs am Anfang des Dateinamens interpretiert rm das Nachfolgende als Optionenliste (wie -g -a -c -k), und das geht natürlich schief. Die Lösung präsentiert die Fehlermeldung gleich mit: Setzen Sie einen Punkt und einen Schrägstrich vor den Dateinamen, um die Datei mit Bindestrich zu entfernen. Eine andere Möglichkeit ist die Spezialoption —, die auch bei anderen Kommandos, wie zum Beispiel mv (“move” = “verschieben”) oder cp (“copy” = “kopieren”), funktioniert, wenn ein Dateiname mit beginnendem Strich Probleme macht: Hinter — erwarten die Kommandos keine weiteren Optionen mehr, mit
rm – -gack
können Sie die Datei also auch loswerden.
Manchmal ist es nicht rm, sondern die Shell, die Ihre Befehle falsch interpretiert. Enthält eine Datei Sonderzeichen, wie beispielsweise das Fragezeichen, gilt es aufzupassen. Angenommen, im Verzeichnis liegen drei Dateien: “h?hn.txt”, “huhn.txt” und “hahn.txt”. Tippen Sie nun rm h?hn.txt, löscht das Tool alle drei Dateien, denn in der Bash steht das Fragezeichen für ein beliebiges Zeichen, so dass “h?hn.txt” zu “h?hn.txt”, “huhn.txt” und “hahn.txt” aufgelöst wird. Damit die Shell das Wildcard-Zeichen nicht interpretiert, schließen Sie entweder den Dateinamen in Hochkommata ein oder stellen vor das Fragezeichen einen Backslash (\).
Auf diese Weise erwischen Sie nicht nur die Sonderzeichen, sondern löschen auch Dateien mit Leerzeichen, zum Beispiel:
rm datei\ mit\ luecke.txt rm "datei mit luecke.txt"
Tipp: Tab-Completion für Hostnames
Die Tabulatortaste spart beim Arbeiten auf der Shell so manches an Tipparbeit, da sie Ihre Eingaben ergänzt. Vielleicht benutzen Sie das praktische Feature schon für Datei- und Verzeichnisnamen: Um mit dem Befehl ls ins Verzeichnis /etc/X11/ hineinzuschauen, reicht in der Regel
ls /e
und dann [Tab]. Die Bash vervollständigt den Namen zu “/etc/”. Das Unterverzeichnis X11 erreichen Sie danach über Eingabe von X und [Tab], denn auch der Name ist eindeutig. Gibt es mehrere Treffer, piept es beim Drücken der Tabulatortaste; wenn Sie diese danach noch einmal betätigen, sehen Sie alle möglichen Treffer.
Die Tab-Completion (deutsch: Tab-Vervollständigung) funktioniert auf neueren Distributionen allerdings nicht nur bei Dateien und Verzeichnissen, sondern auch für Hostnamen anderer Rechner, wenn Sie beispielsweise mit SSH oder SCP arbeiten. Dabei greift das Feature auf Informationen aus der Datei ~/.ssh/known_hosts zu, in der die Fingerabdrücke der Rechner stehen, zu denen Sie schon einmal Verbindung aufgenommen haben [1].
Einen kleinen Stolperstein gilt es hier eventuell noch aus dem Weg zu schaffen, wenn Sie das Feature verwenden möchten: Neuere SSH-Versionen speichern die Hostnamen nicht mehr im Klartext sondern als Hash. Um das abzuschalten, gehen Sie so vor:
- Starten Sie Ihren Lieblingstexteditor und öffnen Sie entweder eine bereits vorhandene Datei ~/.ssh/config oder legen Sie eine neue Datei mit diesem Namen an.
-
Tragen Sie die Zeile
HashKnownHosts no
ein, speichern Sie die Änderungen und verlassen Sie den Texteditor.
Wenn Sie das nächste Mal mit SSH oder SCP arbeiten, landen die Hostnamen nun wieder im Klartext in der Datei ~/.ssh/known_hosts, und Sie können die Tab-Completion verwenden. Tippen Sie beispielsweise ssh huhn@ und drücken dann zweimal [Tab], erscheinen alle bekannten Hostnamen als Ausgabe:
ssh huhn@[Tab][Tab] huhn@transpluto huhn@asteroid huhn@macnugget
Wie bei der Tab-Completion üblich, vervollständigt die Shell den Namen, sobald die Eingabe eindeutig ist, so dass in diesem Beispiel ssh huhn@t und [Tab] reicht – die Bash macht selbstständig huhn@transpluto daraus.
Tipp: Befehlsfolgen in der Bash-History
Der Artikel unter [2] verrät viele Tricks und Kniffe zur Linux-Shell Bash. Unter anderem erfahren Sie dort, dass die Bash sich alte Befehle “merkt” und in der Datei ~/.bash_history ablegt. Der Artikel zeigt ebenfalls, wie Sie über die Tastenkombination [Strg]+[R] alte Kommandos in der History wiederfinden. Dieses Feature können Sie sich zunutze machen, um alte Befehlsabfolgen wiederzubeleben.
Wenn Sie bei einem Treffer anstelle der Eingabetaste die Kombination [Strg]+[O] drücken, führt die Bash nicht nur den alten Befehl noch einmal aus, sondern zeigt auch das nächste Kommando aus dem Speicher an. Drücken Sie noch einmal [Strg]+[O], um diesen Befehl dann auszuführen und den nächsten aus der Befehls-History einzublenden. Ist eine Befehlsabfolge vollständig und möchten Sie diese Kommandos nacheinander abarbeiten, bestätigen Sie das durch Druck der Eingabetaste; andernfalls brechen Sie den Vorgang über [Strg]+[C] ab.
Tipp: Kommandos nach Verzögerung starten
Manchmal möchte man gerne eine kleine Pause einlegen, bevor ein bestimmtes Programm seinen Dienst aufnimmt. In einem solchen Fall erweist sich das Tool sleep als praktisch. Es erwartet als Argument die Angabe, wie lange die Pause sein soll. In der Voreinstellung steht die Einheit auf Sekunden; so sorgt der Befehl
sleep 10
dafür, dass die Bash für zehn Sekunden in den Ruhestand geht. Andere Maßeinheiten sind m (für Minuten), h für Stunden und d für Tage – die Maßangabe schreiben Sie hinter die Zahl, etwa sleep 3m für drei Minuten Schlaf.
sleep erweist sich besonders praktisch in Kombination mit anderen Programmen. So sorgt der Befehl
sleep 10; import -window root screenshot.png
dafür, dass das Programm import aus dem ImageMagick-Paket nach zehn Sekunden ein Foto namens screenshot.png vom gesamten Desktop erstellt.
Glossar
-
Wildcard
-
Die klassischen Wildcard-Zeichen sind das Fragezeichen, das für ein beliebiges Zeichen steht, und das Sternchen (*), das für eine beliebige (auch die leere) Zeichenkette steht. Wildcards funktionieren nicht nur unter Linux, sondern auch unter Windows.
-
Hash
-
Ein Hash entsteht, indem mit einer kryptographischen Funktion ein Quelltext auf einen “verschlüsselten” Text von fester, kurzer Länge abgebildet wird. Die dafür verwendete Hash-Funktion soll so gestaltet sein, dass kleine Änderungen am Originaltext auch zu einer Änderung am Hash führen. Hashes verwendet beispielsweise die Passwortdatei, um keine Passwörter im Klartext speichern zu müssen, und mit Hilfe von Hashes können Sie auch den fehlerfreien Download einer Datei aus dem Internet kontrollieren, wenn es auf der Webseite eine Liste mit Hashes zu den Dateien gibt.
[1] Artikel über SSH und SCP: Heike Jurzik, “Auf Nummer Sicher”, EasyLinux 10/2005, S. 84 ff., http://www.easylinux.de/2005/10/084-guru-ssh/
[2] Besser arbeiten in der Bash: Heike Jurzik, “Befehlsgewaltig”, EasyLinux 01/2005, S. 79 ff., http://www.easylinux.de/2005/01/079-bash/
