Arbeiten mit Dateien und Verzeichnissen

Zuletzt aktualisiert am 2025-10-23 | Diese Seite bearbeiten

Geschätzte Zeit: 50 Minuten

Übersicht

Fragen

  • Wie kann ich Dateien und Verzeichnisse erstellen, kopieren und löschen?
  • Wie kann ich Dateien bearbeiten?

Ziele

  • Löschen, Kopieren und Verschieben von angegebenen Dateien und/oder Verzeichnissen.
  • Erstellen Sie Dateien in dieser Hierarchie mit einem Editor oder durch Kopieren und Umbenennen vorhandener Dateien.
  • Erstellen Sie eine Verzeichnishierarchie, die einem vorgegebenen Diagramm entspricht.

Erstellen von Verzeichnissen


Wir wissen jetzt, wie wir Dateien und Verzeichnisse erkunden können, aber wie erstellen wir sie überhaupt?

In dieser Folge lernen wir das Erstellen und Verschieben von Dateien und Verzeichnissen am Beispiel des Verzeichnisses exercise-data/writing.

Erster Schritt: sehen, wo wir sind und was wir bereits haben

Wir sollten uns immer noch im Verzeichnis shell-lesson-data auf dem Desktop befinden, was wir mit überprüfen können:

BASH

$ pwd

AUSGABE

/Users/nelle/Desktop/shell-lesson-data

Als nächstes werden wir in das Verzeichnis exercise-data/writing wechseln und sehen, was es enthält:

BASH

$ cd exercise-data/writing/
$ ls -F

AUSGABE

haiku.txt  LittleWomen.txt

Erstellen Sie ein Verzeichnis

Erstellen wir ein neues Verzeichnis namens thesis mit dem Befehl mkdir thesis (der keine Ausgabe hat):

BASH

$ mkdir thesis

Wie der Name schon vermuten lässt, bedeutet mkdir ‘make directory’ (‘Verzeichnis erstellen’). Da thesis ein relativer Pfad ist (d.h. keinen führenden Schrägstrich hat, wie /what/ever/thesis), wird das neue Verzeichnis im aktuellen Arbeitsverzeichnis erstellt:

BASH

$ ls -F

AUSGABE

haiku.txt  LittleWomen.txt  thesis/

Da wir das Verzeichnis thesis gerade erst erstellt haben, befindet sich darin noch nichts:

BASH

$ ls -F thesis

Beachten Sie, dass mkdir nicht darauf beschränkt ist, einzelne Verzeichnisse auf einmal zu erstellen. Die Option -p erlaubt mkdir, ein Verzeichnis mit verschachtelten Unterverzeichnissen in einem einzigen Vorgang zu erstellen:

BASH

$ mkdir -p ../project/data ../project/results

Die Option -R zum ls Befehl listet alle verschachtelten Unterverzeichnisse innerhalb eines Verzeichnisses auf. Lassen Sie uns ls -FR verwenden, um rekursiv die neue Verzeichnishierarchie aufzulisten, die wir gerade im Verzeichnis project erstellt haben:

BASH

$ ls -FR ../project

AUSGABE

../project/:
data/  results/

../project/data:

../project/results:
Wichtig

Zwei Möglichkeiten, das Gleiche zu tun

Die Verwendung der Shell zur Erstellung eines Verzeichnisses unterscheidet sich nicht von der Verwendung eines Datei-Explorers. Wenn Sie das aktuelle Verzeichnis mit dem grafischen Dateiexplorer Ihres Betriebssystems öffnen, wird das Verzeichnis thesis auch dort erscheinen. Während die Shell und der Dateiexplorer zwei verschiedene Wege sind, mit den Dateien zu interagieren, sind die Dateien und Verzeichnisse selbst die gleichen.

Wichtig

Gute Namen für Dateien und Verzeichnisse

Komplizierte Namen von Dateien und Verzeichnissen können Ihnen das Leben schwer machen, wenn Sie auf der Kommandozeile arbeiten. Hier geben wir Ihnen ein paar nützliche Tipps für die Namen Ihrer Dateien und Verzeichnisse.

  1. Verwenden Sie keine Leerzeichen.

Leerzeichen können einen Namen aussagekräftiger machen, aber da Leerzeichen verwendet werden, um Argumente auf der Kommandozeile zu trennen, ist es besser, sie in Namen von Dateien und Verzeichnissen zu vermeiden. Sie können stattdessen - oder _ verwenden (z.B. north-pacific-gyre/ anstelle von north pacific gyre/). Um dies zu testen, versuchen Sie mkdir north pacific gyre einzugeben und sehen Sie, welches Verzeichnis (oder Verzeichnisse!) erstellt wird, wenn Sie mit ls -F prüfen.

  1. Beginnen Sie den Namen nicht mit - (Bindestrich).

Befehle behandeln Namen, die mit - beginnen, als Optionen.

  1. Bleiben Sie bei Buchstaben, Zahlen, . (Punkt), - (Bindestrich) und _ (Unterstrich).

Viele andere Zeichen haben in der Kommandozeile eine besondere Bedeutung. Wir werden in dieser Lektion einige davon kennenlernen. Es gibt Sonderzeichen, die dazu führen können, dass Ihr Befehl nicht wie erwartet funktioniert, und die sogar zu Datenverlust führen können.

Wenn Sie auf Namen von Dateien oder Verzeichnissen verweisen müssen, die Leerzeichen oder andere Sonderzeichen enthalten, sollten Sie den Namen in einfache Anführungszeichen einschließen ('').

Lernende können manchmal in Befehlszeilen-Texteditoren wie Vim, Emacs oder Nano gefangen sein. Das Schließen des Terminalemulators und das Öffnen eines neuen kann frustrierend sein, da die Lernenden erneut zum richtigen Ordner navigieren müssen. Unsere Empfehlung, um dieses Problem zu entschärfen, ist, dass die Lehrkräfte während der Workshops denselben Texteditor wie die Lernenden verwenden sollten (in den meisten Fällen Nano).

Erstellen einer Textdatei

Wechseln wir unser Arbeitsverzeichnis mit cd in thesis und erstellen mit dem Texteditor Nano eine Datei namens draft.txt:

BASH

$ cd thesis
$ nano draft.txt
Wichtig

Welcher Editor?

Wenn wir sagen, ‘nano ist ein Texteditor’, dann meinen wir wirklich ‘Text’. Er kann nur mit einfachen Zeichendaten arbeiten, nicht mit Tabellen, Bildern oder anderen menschenfreundlichen Medien. Wir verwenden ihn in den Beispielen, weil er einer der am wenigsten komplexen Texteditoren ist. Aufgrund dieser Eigenschaft ist er jedoch möglicherweise nicht leistungsfähig oder flexibel genug für die Arbeit, die Sie nach diesem Workshop erledigen müssen. Auf Unix-Systemen (wie Linux und macOS) verwenden viele Programmierer Emacs oder Vim (die beide mehr Zeit zum Erlernen benötigen) oder einen grafischen Editor wie Gedit oder VScode. Unter Windows können Sie auch Notepad++ verwenden. Windows hat auch einen eingebauten Editor namens notepad, der von der Befehlszeile aus auf die gleiche Weise wie nano für die Zwecke dieser Lektion ausgeführt werden kann.

Unabhängig davon, welchen Editor Sie verwenden, müssen Sie wissen, wo er Dateien sucht und speichert. Wenn Sie ihn von der Shell aus starten, wird er (wahrscheinlich) Ihr aktuelles Arbeitsverzeichnis als Standardverzeichnis verwenden. Wenn Sie das Startmenü Ihres Computers verwenden, speichert er die Dateien möglicherweise stattdessen in Ihrem Desktop- oder Dokumentenverzeichnis. Sie können dies ändern, indem Sie beim ersten Mal, wenn Sie “Speichern unter…” wählen, in ein anderes Verzeichnis wechseln

Geben wir ein paar Zeilen Text ein.

Screenshot des Nano-Texteditors in Aktion mit dem Text It's not publish or perish any more, it's share and thrive

Wenn wir mit unserem Text zufrieden sind, können wir Strg+O drücken (drücken Sie die Strg oder Steuerung Taste und, während Sie sie gedrückt halten, drücken Sie die O Taste), um unsere Daten auf die Festplatte zu schreiben. Wir werden aufgefordert, einen Namen für die Datei anzugeben, die unseren Text enthalten soll. Drücken Sie Return, um die vorgeschlagene Vorgabe draft.txt zu übernehmen.

Sobald unsere Datei gespeichert ist, können wir Strg+X verwenden, um den Editor zu verlassen und zur Shell zurückzukehren.

Wichtig

Steuerung, Strg, oder ^ Taste

Die Steuerungstaste wird auch als ‘Strg’-Taste bezeichnet. Es gibt verschiedene Möglichkeiten, die Verwendung der Steuerungstaste zu beschreiben. Zum Beispiel können Sie eine Anweisung sehen, die Steuertaste zu drücken und, während Sie sie gedrückt halten, die X-Taste zu drücken, die wie folgt beschrieben wird:

  • Strg-X
  • Strg+X
  • Strg-X
  • Strg+X
  • ^X
  • C-x

In nano sehen Sie am unteren Rand des Bildschirms ^G Get Help ^O WriteOut. Das bedeutet, dass du Control-G benutzen kannst, um Hilfe zu bekommen und Control-O, um deine Datei zu speichern.

nano hinterlässt nach dem Beenden keine Ausgabe auf dem Bildschirm, aber ls zeigt nun, dass wir eine Datei namens draft.txt erstellt haben:

BASH

$ ls

AUSGABE

draft.txt
Aufgabe

Dateien auf eine andere Weise erstellen

Wir haben gesehen, wie man Textdateien mit dem Editor nano erstellt. Versuchen Sie nun den folgenden Befehl:

BASH

$ touch my_file.txt
  1. Was hat der Befehl touch bewirkt? Wenn Sie sich Ihr aktuelles Verzeichnis mit dem GUI-Dateiexplorer ansehen, wird die Datei dann angezeigt?

  2. Benutze ls -l, um die Dateien zu untersuchen. Wie groß ist my_file.txt?

  3. Wann würden Sie eine Datei auf diese Weise erstellen wollen?

  1. Der Befehl touch erzeugt eine neue Datei namens my_file.txt in Ihrem aktuellen Verzeichnis. Sie können diese neu erzeugte Datei beobachten, indem Sie ls an der Eingabeaufforderung eingeben. die Datei my_file.txt kann auch in Ihrem GUI-Dateiexplorer angezeigt werden.

  2. Wenn Sie die Datei mit ls -l untersuchen, beachten Sie, dass die Größe von my_file.txt 0 Bytes beträgt. Mit anderen Worten, sie enthält keine Daten. Wenn Sie my_file.txt mit Ihrem Texteditor öffnen, ist sie leer.

  3. Einige Programme erzeugen nicht selbst Ausgabedateien, sondern setzen voraus, dass bereits leere Dateien erzeugt wurden. Wenn das Programm ausgeführt wird, sucht es nach einer vorhandenen Datei, um sie mit seiner Ausgabe zu füllen. Mit dem Befehl touch können Sie auf effiziente Weise eine leere Textdatei erzeugen, die von solchen Programmen verwendet werden kann.

Diskussion

Dateien auf eine andere Weise erstellen (continued)

Um spätere Verwirrung zu vermeiden, empfehlen wir, die soeben erstellte Datei zu entfernen, bevor Sie mit dem Rest der Episode fortfahren, da sonst die zukünftigen Ausgaben von denen in der Lektion abweichen können. Verwenden Sie dazu den folgenden Befehl:

BASH

$ rm my_file.txt
Wichtig

What’s In A Name?

Sie haben vielleicht bemerkt, dass alle Dateien von Nelle “irgendetwas dot irgendetwas” heißen, und in diesem Teil der Lektion haben wir immer die Erweiterung .txt verwendet. Dies ist nur eine Konvention; wir können eine Datei mythesis oder fast alles andere nennen, was wir wollen. Die meisten Leute verwenden jedoch meist zweiteilige Namen, um ihnen (und ihren Programmen) zu helfen, verschiedene Arten von Dateien zu unterscheiden. Der zweite Teil eines solchen Namens wird Dateinamenerweiterung genannt und gibt an, welche Art von Daten die Datei enthält: .txt signalisiert eine einfache Textdatei, .pdf weist auf ein PDF-Dokument hin, .cfg ist eine Konfigurationsdatei mit Parametern für ein Programm oder ein anderes, .png ist ein PNG-Bild, und so weiter.

Dies ist nur eine Konvention, wenn auch eine wichtige. Dateien enthalten lediglich Bytes; es liegt an uns und unseren Programmen, diese Bytes gemäß den Regeln für einfache Textdateien, PDF-Dokumente, Konfigurationsdateien, Bilder usw. zu interpretieren.

Ein PNG-Bild eines Wals als whale.mp3 zu benennen, verwandelt es nicht irgendwie auf magische Weise in eine Aufnahme von Walgesang, obwohl es möglicherweise das Betriebssystem veranlasst, die Datei mit einem Musikabspielprogramm zu assoziieren. In diesem Fall, wenn jemand in einem Dateiexplorer-Programm auf whale.mp3 doppelklickt, wird der Musik-Player automatisch (und fälschlicherweise) versuchen, die Datei whale.mp3 zu öffnen.

Dateien und Verzeichnisse verschieben


Rückkehr in das Verzeichnis shell-lesson-data/exercise-data/writing,

BASH

$ cd ~/Desktop/shell-lesson-data/exercise-data/writing

In unserem thesis Verzeichnis haben wir eine Datei draft.txt, was kein besonders informativer Name ist, also ändern wir den Namen der Datei mit mv, was kurz für ‘move’ (‘verschieben’) ist:

BASH

$ mv thesis/draft.txt thesis/quotes.txt

Das erste Argument gibt an, was wir verschieben, während das zweite angibt, wohin es gehen soll. In diesem Fall verschieben wir thesis/draft.txt nach thesis/quotes.txt, was den gleichen Effekt hat wie das Umbenennen der Datei. Sicherlich zeigt uns ls, dass thesis nun eine Datei namens quotes.txt enthält:

BASH

$ ls thesis

AUSGABE

quotes.txt

Man muss vorsichtig sein, wenn man den Namen der Zieldatei angibt, da mv stillschweigend jede existierende Datei mit demselben Namen überschreibt, was zu Datenverlust führen kann. Standardmäßig wird mv vor dem Überschreiben von Dateien nicht nach einer Bestätigung fragen. Eine zusätzliche Option, mv -i (oder mv --interactive), veranlasst mv jedoch, eine solche Bestätigung zu verlangen.

Beachten Sie, dass mv auch bei Verzeichnissen funktioniert.

Lass uns quotes.txt in das aktuelle Arbeitsverzeichnis verschieben. Wir verwenden wieder mv, aber dieses Mal geben wir nur den Namen eines Verzeichnisses als zweites Argument an, um mv mitzuteilen, dass wir den Dateinamen behalten, aber die Datei an einen neuen Ort verschieben wollen. (Deshalb heißt der Befehl ‘move’.) In diesem Fall ist der Verzeichnisname, den wir verwenden, der spezielle Verzeichnisname ., den wir bereits erwähnt haben.

BASH

$ mv thesis/quotes.txt .

Der Effekt ist, dass die Datei von dem Verzeichnis, in dem sie sich befand, in das aktuelle Arbeitsverzeichnis verschoben wird. ls zeigt uns nun, dass thesis leer ist:

BASH

$ ls thesis

AUSGABE

$

Alternativ können wir bestätigen, dass die Datei quotes.txt nicht mehr im Verzeichnis thesis vorhanden ist, indem wir explizit versuchen, sie aufzulisten:

BASH

$ ls thesis/quotes.txt

FEHLER

ls: cannot access 'thesis/quotes.txt': No such file or directory

ls mit einem Dateinamen oder Verzeichnis als Argument listet nur die angeforderte Datei oder das Verzeichnis auf. Wenn die als Argument angegebene Datei nicht existiert, gibt die Shell einen Fehler zurück, wie wir oben gesehen haben. Wir können dies benutzen, um zu sehen, dass quotes.txt jetzt in unserem aktuellen Verzeichnis vorhanden ist:

BASH

$ ls quotes.txt

AUSGABE

quotes.txt
Aufgabe

Verschieben von Dateien in einen neuen Ordner

Nachdem sie die folgenden Befehle ausgeführt hat, stellt Jamie fest, dass sie die Dateien sucrose.dat und maltose.dat in den falschen Ordner gelegt hat. Die Dateien hätten in den Ordner raw gelegt werden müssen.

BASH

$ ls -F
 analyzed/ raw/
$ ls -F analyzed
fructose.dat glucose.dat maltose.dat sucrose.dat
$ cd analyzed

Füllen Sie die Felder aus, um diese Dateien in den Ordner raw/ zu verschieben (d.h. in den Ordner, in den sie vergessen hat, sie abzulegen)

BASH

$ mv sucrose.dat maltose.dat ____/____

BASH

$ mv sucrose.dat maltose.dat ../raw

Erinnern Sie sich, dass sich .. auf das übergeordnete Verzeichnis (d.h. eines über dem aktuellen Verzeichnis) und . auf das aktuelle Verzeichnis bezieht.

Kopieren von Dateien und Verzeichnissen


Der Befehl cp funktioniert ähnlich wie mv, nur dass er eine Datei kopiert, anstatt sie zu verschieben. Wir können überprüfen, ob er das Richtige getan hat, indem wir ls mit zwei Pfaden als Argumente verwenden — wie die meisten Unix-Befehle kann ls mehrere Pfade auf einmal erhalten:

BASH

$ cp quotes.txt thesis/quotations.txt
$ ls quotes.txt thesis/quotations.txt

AUSGABE

quotes.txt   thesis/quotations.txt

Wir können auch ein Verzeichnis und seinen gesamten Inhalt kopieren, indem wir die Option recursive -r verwenden, z.B. um ein Verzeichnis zu sichern:

BASH

$ cp -r thesis thesis_backup

Wir können das Ergebnis überprüfen, indem wir den Inhalt der beiden Verzeichnisse thesis und thesis_backup auflisten:

BASH

$ ls thesis thesis_backup

AUSGABE

thesis:
quotations.txt

thesis_backup:
quotations.txt

Es ist wichtig, das -r-Flag einzuschließen. Wenn Sie ein Verzeichnis kopieren wollen und diese Option weglassen, werden Sie eine Meldung sehen, dass das Verzeichnis weggelassen wurde, weil -r not specified.

BASH

$ cp thesis thesis_backup
cp: -r not specified; omitting directory 'thesis'
Aufgabe

Umbenennen von Dateien

Angenommen, Sie haben in Ihrem aktuellen Verzeichnis eine Textdatei erstellt, die eine Liste der statistischen Tests enthält, die Sie für die Analyse Ihrer Daten benötigen, und sie statstics.txt genannt

Nachdem Sie diese Datei erstellt und gespeichert haben, stellen Sie fest, dass Sie den Dateinamen falsch geschrieben haben! Sie möchten den Fehler korrigieren. Welchen der folgenden Befehle können Sie dazu verwenden?

  1. cp statstics.txt statistics.txt
  2. mv statstics.txt statistics.txt
  3. mv statstics.txt .
  4. cp statstics.txt .
  1. Nein. Dies würde zwar eine Datei mit dem richtigen Namen erstellen, aber die falsch benannte Datei ist noch im Verzeichnis vorhanden und müsste gelöscht werden.
  2. Ja, das würde funktionieren, um die Datei umzubenennen.
  3. Nein, der Punkt(.) zeigt an, wohin die Datei verschoben werden soll, gibt aber keinen neuen Dateinamen an; identische Dateinamen können nicht erstellt werden.
  4. Nein, der Punkt(.) gibt an, wohin die Datei kopiert werden soll, liefert aber keinen neuen Dateinamen; identische Dateinamen können nicht erstellt werden.
Aufgabe

Verschieben und Kopieren

Was ist die Ausgabe des abschließenden Befehls ls in der unten gezeigten Reihenfolge?

BASH

$ pwd

AUSGABE

/Users/jamie/data

BASH

$ ls

AUSGABE

proteins.dat

BASH

$ mkdir recombined
$ mv proteins.dat recombined/
$ cp recombined/proteins.dat ../proteins-saved.dat
$ ls
  1. proteins-saved.dat recombined
  2. recombined
  3. proteins.dat recombined
  4. proteins-saved.dat

Wir beginnen im Verzeichnis /Users/jamie/data und erstellen einen neuen Ordner namens recombined. Die zweite Zeile verschiebt (mv) die Datei proteins.dat in den neuen Ordner (recombined). Die dritte Zeile erstellt eine Kopie der Datei, die wir gerade verschoben haben. Der knifflige Teil hier ist, wohin die Datei kopiert wurde. Erinnern Sie sich, dass .. “eine Ebene höher gehen” bedeutet, also befindet sich die kopierte Datei jetzt in /Users/jamie. Beachten Sie, dass .. in Bezug auf das aktuelle Arbeitsverzeichnis interpretiert wird, nicht in Bezug auf den Ort der kopierten Datei. Das einzige, was mit ls (in /Users/jamie/data) angezeigt wird, ist also der neu zusammengestellte Ordner.

  1. Nein, siehe Erklärung oben. proteins-saved.dat befindet sich in /Users/jamie
  2. Ja
  3. Nein, siehe Erklärung oben. proteins.dat befindet sich in /Users/jamie/data/recombined
  4. Nein, siehe Erklärung oben. proteins-saved.dat befindet sich in /Users/jamie

Entfernen von Dateien und Verzeichnissen


Kehren wir zum Verzeichnis shell-lesson-data/exercise-data/writing zurück und räumen wir dieses Verzeichnis auf, indem wir die Datei quotes.txt entfernen, die wir erstellt haben. Der Unix-Befehl, den wir dafür verwenden, ist rm (kurz für ‘remove’):

BASH

$ rm quotes.txt

Wir können bestätigen, dass die Datei mit ls verschwunden ist:

BASH

$ ls quotes.txt

FEHLER

ls: cannot access 'quotes.txt': No such file or directory
Wichtig

Deleting Is Forever

Die Unix-Shell hat keinen Papierkorb, aus dem wir gelöschte Dateien wiederherstellen können (obwohl die meisten grafischen Oberflächen von Unix dies tun). Wenn wir Dateien löschen, werden sie stattdessen aus dem Dateisystem entfernt, damit ihr Speicherplatz auf der Festplatte wiederverwendet werden kann. Es gibt zwar Tools zum Auffinden und Wiederherstellen gelöschter Dateien, aber es gibt keine Garantie, dass sie in jeder Situation funktionieren, da der Computer den Speicherplatz der Datei möglicherweise sofort wiederverwendet.

Aufgabe

Sichere Verwendung von rm

Was passiert, wenn wir rm -i thesis_backup/quotations.txt ausführen? Warum sollten wir diesen Schutz haben, wenn wir rm verwenden?

AUSGABE

rm: remove regular file 'thesis_backup/quotations.txt'? y

Die Option -i fragt vor (jedem) Löschen nach (verwenden Sie Y, um das Löschen zu bestätigen oder N, um die Datei zu behalten). Die Unix-Shell hat keinen Mülleimer, so dass alle gelöschten Dateien für immer verschwinden werden. Mit der Option -i können wir überprüfen, dass wir nur die Dateien löschen, die wir auch wirklich löschen wollen.

Wenn wir versuchen, das Verzeichnis thesis mit rm thesis zu entfernen, erhalten wir eine Fehlermeldung:

BASH

$ rm thesis

FEHLER

rm: cannot remove 'thesis': Is a directory

Das passiert, weil rm standardmäßig nur bei Dateien funktioniert, nicht bei Verzeichnissen.

rm kann ein Verzeichnis mitsamt seinem Inhalt entfernen, wenn wir die rekursive Option -r verwenden, und es wird dies ohne jegliche Bestätigungsaufforderung tun:

BASH

$ rm -r thesis

Da es keine Moeglichkeit gibt, mit der Shell geloeschte Dateien wiederherzustellen, sollte rm -r mit grosser Vorsicht verwendet werden (man koennte die interaktive Option rm -r -i hinzufuegen).

Operationen mit mehreren Dateien und Verzeichnissen


Oftmals muss man mehrere Dateien auf einmal kopieren oder verschieben. Dies kann durch die Angabe einer Liste einzelner Dateinamen oder durch die Angabe eines Namensmusters mit Wildcards geschehen. Wildcards sind Sonderzeichen, die verwendet werden können, um unbekannte Zeichen oder Zeichensätze bei der Navigation im Unix-Dateisystem darzustellen.

Aufgabe

Kopieren mit mehreren Dateinamen

Für diese Übung können Sie die Befehle im Verzeichnis shell-lesson-data/exercise-data testen.

Was macht cp im folgenden Beispiel, wenn mehrere Dateinamen und ein Verzeichnisname angegeben werden?

BASH

$ mkdir backup
$ cp creatures/minotaur.dat creatures/unicorn.dat backup/

Was macht cp im folgenden Beispiel, wenn drei oder mehr Dateinamen angegeben werden?

BASH

$ cd creatures
$ ls -F

AUSGABE

basilisk.dat  minotaur.dat  unicorn.dat

BASH

$ cp minotaur.dat unicorn.dat basilisk.dat

Wenn mehr als ein Dateiname gefolgt von einem Verzeichnisnamen angegeben wird (d.h. das Zielverzeichnis muss das letzte Argument sein), kopiert cp die Dateien in das genannte Verzeichnis.

Wenn drei Dateinamen angegeben werden, gibt cp einen Fehler wie den folgenden aus, weil es einen Verzeichnisnamen als letztes Argument erwartet.

FEHLER

cp: target 'basilisk.dat' is not a directory

Verwendung von Platzhaltern für den gleichzeitigen Zugriff auf mehrere Dateien

Wichtig

Wildcards

* ist eine Wildcard, die für null oder mehr andere Zeichen steht. Betrachten wir das Verzeichnis shell-lesson-data/exercise-data/alkanes: *.pdb steht für ethane.pdb, propane.pdb und jede Datei, die mit ‘.pdb’ endet. Auf der anderen Seite repräsentiert p*.pdb nur pentane.pdb und propane.pdb, weil das ‘p’ am Anfang nur Dateinamen repräsentieren kann, die mit dem Buchstaben ‘p’ beginnen.

? ist auch ein Platzhalter, aber er steht für genau ein Zeichen. So könnte ?ethane.pdb für methane.pdb stehen, während *ethane.pdb sowohl für ethane.pdb als auch für methane.pdb steht.

Wildcards können in Kombination miteinander verwendet werden. Zum Beispiel gibt ???ane.pdb drei Zeichen an, gefolgt von ane.pdb, was cubane.pdb ethane.pdb octane.pdb ergibt.

Wenn die Shell einen Platzhalter sieht, expandiert sie diesen, um eine Liste passender Dateinamen zu erstellen, bevor sie den vorangehenden Befehl ausführt. Ausnahmsweise, wenn ein Platzhalterausdruck mit keiner Datei übereinstimmt, übergibt die Bash den Ausdruck als Argument an den Befehl, wie er ist. Wenn Sie beispielsweise ls *.pdf im Verzeichnis alkanes eingeben (das nur Dateien enthält, deren Namen auf .pdb enden), erhalten Sie die Fehlermeldung, dass es keine Datei namens *.pdf gibt. Im Allgemeinen sehen Befehle wie wc und ls jedoch die Listen der Dateinamen, die auf diese Ausdrücke passen, aber nicht die Platzhalter selbst. Es ist die Shell, nicht die anderen Programme, die die Wildcards expandiert.

Aufgabe

Auflisten der Dateinamen, die einem Muster entsprechen

Welche(r) ls-Befehl(e) erzeugt/erzeugen diese Ausgabe, wenn er/sie im Verzeichnis alkanes ausgeführt wird/werden?

ethane.pdb methane.pdb

  1. ls *t*ane.pdb
  2. ls *t?ne.*
  3. ls *t??ne.pdb
  4. ls ethane.*

Die Lösung lautet 3.

1. zeigt alle Dateien an, deren Namen null oder mehr Zeichen (*) gefolgt von dem Buchstaben t, dann null oder mehr Zeichen (*) gefolgt von ane.pdb enthalten. Dies ergibt ethane.pdb methane.pdb octane.pdb pentane.pdb.

2. zeigt alle Dateien, deren Namen mit null oder mehr Zeichen beginnen (*), gefolgt von dem Buchstaben t, dann ein einzelnes Zeichen (?), dann ne. gefolgt von null oder mehr Zeichen (*). Dies ergibt octane.pdb und pentane.pdb, aber keine Übereinstimmung mit etwas, das auf thane.pdb endet.

3. behebt die Probleme von Option 2, indem zwei Zeichen (??) zwischen t und ne gefunden werden. Dies ist die Lösung.

4. zeigt nur Dateien, die mit ethane. beginnen.

Aufgabe

Mehr über Wildcards

Sam hat ein Verzeichnis mit Kalibrierungsdaten, Datensätzen und Beschreibungen der Datensätze:

BASH

.
├── 2015-10-23-calibration.txt
├── 2015-10-23-dataset1.txt
├── 2015-10-23-dataset2.txt
├── 2015-10-23-dataset_overview.txt
├── 2015-10-26-calibration.txt
├── 2015-10-26-dataset1.txt
├── 2015-10-26-dataset2.txt
├── 2015-10-26-dataset_overview.txt
├── 2015-11-23-calibration.txt
├── 2015-11-23-dataset1.txt
├── 2015-11-23-dataset2.txt
├── 2015-11-23-dataset_overview.txt
├── backup
│   ├── calibration
│   └── datasets
└── send_to_bob
    ├── all_datasets_created_on_a_23rd
    └── all_november_files

Bevor sie zu einer weiteren Exkursion aufbricht, möchte sie ihre Daten sichern und einige Datensätze an ihren Kollegen Bob schicken. Sam verwendet die folgenden Befehle, um diese Aufgabe zu erledigen:

BASH

$ cp *dataset* backup/datasets
$ cp ____calibration____ backup/calibration
$ cp 2015-____-____ send_to_bob/all_november_files/
$ cp ____ send_to_bob/all_datasets_created_on_a_23rd/

Hilf Sam, indem du die Lücken ausfüllst.

Die resultierende Verzeichnisstruktur sollte wie folgt aussehen

BASH

.
├── 2015-10-23-calibration.txt
├── 2015-10-23-dataset1.txt
├── 2015-10-23-dataset2.txt
├── 2015-10-23-dataset_overview.txt
├── 2015-10-26-calibration.txt
├── 2015-10-26-dataset1.txt
├── 2015-10-26-dataset2.txt
├── 2015-10-26-dataset_overview.txt
├── 2015-11-23-calibration.txt
├── 2015-11-23-dataset1.txt
├── 2015-11-23-dataset2.txt
├── 2015-11-23-dataset_overview.txt
├── backup
│   ├── calibration
│   │   ├── 2015-10-23-calibration.txt
│   │   ├── 2015-10-26-calibration.txt
│   │   └── 2015-11-23-calibration.txt
│   └── datasets
│       ├── 2015-10-23-dataset1.txt
│       ├── 2015-10-23-dataset2.txt
│       ├── 2015-10-23-dataset_overview.txt
│       ├── 2015-10-26-dataset1.txt
│       ├── 2015-10-26-dataset2.txt
│       ├── 2015-10-26-dataset_overview.txt
│       ├── 2015-11-23-dataset1.txt
│       ├── 2015-11-23-dataset2.txt
│       └── 2015-11-23-dataset_overview.txt
└── send_to_bob
    ├── all_datasets_created_on_a_23rd
    │   ├── 2015-10-23-dataset1.txt
    │   ├── 2015-10-23-dataset2.txt
    │   ├── 2015-10-23-dataset_overview.txt
    │   ├── 2015-11-23-dataset1.txt
    │   ├── 2015-11-23-dataset2.txt
    │   └── 2015-11-23-dataset_overview.txt
    └── all_november_files
        ├── 2015-11-23-calibration.txt
        ├── 2015-11-23-dataset1.txt
        ├── 2015-11-23-dataset2.txt
        └── 2015-11-23-dataset_overview.txt

BASH

$ cp *calibration.txt backup/calibration
$ cp 2015-11-* send_to_bob/all_november_files/
$ cp *-23-dataset* send_to_bob/all_datasets_created_on_a_23rd/
Aufgabe

Organisieren von Verzeichnissen und Dateien

Jamie arbeitet an einem Projekt und stellt fest, dass ihre Dateien nicht sehr gut organisiert sind:

BASH

$ ls -F

AUSGABE

analyzed/  fructose.dat    raw/   sucrose.dat

Die Dateien fructose.dat und sucrose.dat enthalten die Ausgabe ihrer Datenanalyse. Welche(n) Befehl(e), der/die in dieser Lektion behandelt wurde(n), muss sie ausführen, damit die folgenden Befehle die gezeigte Ausgabe erzeugen?

BASH

$ ls -F

AUSGABE

analyzed/   raw/

BASH

$ ls analyzed

AUSGABE

fructose.dat    sucrose.dat

BASH

mv *.dat analyzed

Jamie muss ihre Dateien fructose.dat und sucrose.dat in das Verzeichnis analyzed verschieben. Die Shell expandiert *.dat, um alle .dat-Dateien im aktuellen Verzeichnis zu finden. Der Befehl mv verschiebt dann die Liste der .dat-Dateien in das Verzeichnis “analyzed”.

Aufgabe

Reproduzieren einer Ordnerstruktur

Sie beginnen ein neues Experiment und möchten die Verzeichnisstruktur Ihres vorherigen Experiments duplizieren, damit Sie neue Daten hinzufügen können.

Angenommen, das vorherige Experiment befindet sich in einem Ordner namens 2016-05-18, der einen Ordner data enthält, der wiederum Ordner namens raw und processed enthält, die Datendateien enthalten. Das Ziel ist es, die Ordnerstruktur des Ordners 2016-05-18 in einen Ordner namens 2016-05-20 zu kopieren, so dass die endgültige Verzeichnisstruktur wie folgt aussieht:

AUSGABE

2016-05-20/
└── data
   ├── processed
   └── raw

Welcher der folgenden Befehle würde dieses Ziel erreichen? Was würden die anderen Befehle bewirken?

BASH

$ mkdir 2016-05-20
$ mkdir 2016-05-20/data
$ mkdir 2016-05-20/data/processed
$ mkdir 2016-05-20/data/raw

BASH

$ mkdir 2016-05-20
$ cd 2016-05-20
$ mkdir data
$ cd data
$ mkdir raw processed

BASH

$ mkdir 2016-05-20/data/raw
$ mkdir 2016-05-20/data/processed

BASH

$ mkdir -p 2016-05-20/data/raw
$ mkdir -p 2016-05-20/data/processed

BASH

$ mkdir 2016-05-20
$ cd 2016-05-20
$ mkdir data
$ mkdir raw processed

Die ersten beiden Befehlssätze erreichen dieses Ziel. Der erste Satz verwendet relative Pfade, um das oberste Verzeichnis vor den Unterverzeichnissen zu erstellen.

Der dritte Satz von Befehlen gibt einen Fehler, weil das Standardverhalten von mkdir kein Unterverzeichnis eines nicht existierenden Verzeichnisses erstellt: die Ordner der Zwischenebene müssen zuerst erstellt werden.

Der vierte Satz von Befehlen erreicht dieses Ziel. Denken Sie daran, dass die Option -p, gefolgt von einem Pfad zu einem oder mehreren Verzeichnissen, mkdir veranlasst, alle dazwischen liegenden Unterverzeichnisse zu erstellen, wie es erforderlich ist.

Der letzte Satz von Befehlen erzeugt die Verzeichnisse “raw” und “processed” auf derselben Ebene wie das Verzeichnis “data”.

Hauptpunkte
  • cp [old] [new] kopiert eine Datei.
  • mkdir [path] ein neues Verzeichnis erstellt.
  • mv [old] [new] verschiebt (benennt) eine Datei oder ein Verzeichnis um.
  • rm [path] entfernt (löscht) eine Datei.
  • * passt auf null oder mehr Zeichen in einem Dateinamen, also passt *.txt auf alle Dateien, die auf .txt enden.
  • ? passt auf jedes einzelne Zeichen in einem Dateinamen, also passt ?.txt auf a.txt, aber nicht auf any.txt.
  • Die Verwendung des Steuerschlüssels kann auf viele Arten beschrieben werden, einschließlich Ctrl-X, Control-X und ^X.
  • Die Shell hat keinen Mülleimer: Wenn etwas gelöscht ist, ist es wirklich weg.
  • Die meisten Dateinamen sind something.extension. Die Erweiterung ist nicht erforderlich und garantiert nichts, wird aber normalerweise verwendet, um die Art der Daten in der Datei anzugeben.
  • Abhängig von der Art Ihrer Arbeit benötigen Sie möglicherweise einen leistungsfähigeren Texteditor als Nano.