Die Befehlszeile · Übung
Erstellen, kopieren, verschieben und löschen
Du möchtest Dateien aus einer Shell neu ordnen und bist vielleicht direkt aus einem anderen Kurs hierhergekommen. Vier Operationen decken fast alles ab: erstellen, kopieren, verschieben und löschen. Jede verändert den Baum. Deshalb lohnt sich danach jeweils ein Blick, ob sie das Beabsichtigte getan hat.
Das Terminal neben dieser Lektion enthält ein gehostetes Übungsprojekt unter /workspace, getrennt von deinem eigenen Computer. Bearbeite die Beispiele und die bewertete Übung dort. Vor Änderungen musst du deinen Ort prüfen, navigieren, ein Verzeichnis auflisten und eine Datei mit einem Pfad in Anführungszeichen lesen können. Falls du das noch nicht gemacht hast, folge diesen Lektionen der Reihe nach und kehre dann zurück:
Kopieren
Eine Kopie lässt das Original unangetastet und erstellt einen zweiten Eintrag an einem anderen Ort. Beginne bei /workspace:
New-Item -ItemType Directory -Path ./destination/scratch
Copy-Item -LiteralPath ./README.md -Destination ./destination/scratch/readme-demo.md
Get-Content -LiteralPath ./destination/scratch/readme-demo.md
-LiteralPath ist die Quelle, -Destination das Ziel der Kopie. Beide zu benennen verhindert ihre Vertauschung. Das ist der Fehler, zu dem dieser Befehl verleitet.
mkdir destination/scratch
cp README.md destination/scratch/readme-demo.md
cat destination/scratch/readme-demo.md
cp nimmt zuerst die Quelle und dann das Ziel. Nichts in der Zeile erinnert dich daran, was was ist. Diese Reihenfolge musst du dir merken. Ihre Vertauschung ist der Fehler, zu dem dieser Befehl verleitet.
mkdir destination/scratch
cp README.md destination/scratch/readme-demo.md
cat destination/scratch/readme-demo.md
cp nimmt zuerst die Quelle und dann das Ziel. Nichts in der Zeile erinnert dich daran, was was ist. Diese Reihenfolge musst du dir merken. Ihre Vertauschung ist der Fehler, zu dem dieser Befehl verleitet.
Die Kopie danach zu lesen kostet einen Befehl und deckt ein falsch getipptes Ziel auf, das sonst lange unsichtbar bleiben würde.
Verschieben bedeutet auch Umbenennen
Verschieben ändert den Pfad eines Eintrags. Das umfasst beide Aufgaben, die Menschen getrennt betrachten: Mit einem neuen Verzeichnis wird die Datei verschoben, mit einem neuen Namen im selben Verzeichnis wird sie umbenannt. Für beides gibt es einen Befehl, denn für das Dateisystem ist es dieselbe Änderung.
New-Item -ItemType File -Path ./destination/scratch/draft.txt
Move-Item -LiteralPath ./destination/scratch/draft.txt -Destination ./destination/scratch/final.txt
Get-ChildItem -LiteralPath ./destination/scratch
touch destination/scratch/draft.txt
mv destination/scratch/draft.txt destination/scratch/final.txt
ls -1 destination/scratch
touch destination/scratch/draft.txt
mv destination/scratch/draft.txt destination/scratch/final.txt
ls -1 destination/scratch
Die Auflistung zeigt final.txt und kein draft.txt. Das ist der sichtbare Unterschied zum Kopieren: In diesem Beispiel innerhalb desselben Dateisystems existiert jetzt der Zielpfad und nicht mehr der Quellpfad.
Achte auf eines: Shells teilen keine einheitliche Regel für Namenskollisionen. PowerShells Move-Item meldet normalerweise einen Fehler, wenn der Zieldateiname bereits existiert. Verbreitete Unix-Implementierungen von mv können eine vorhandene Datei dagegen ersetzen. Die sichere Regel gilt in beiden Fällen: Prüfe vor dem Verschieben das Ziel und wähle einen neuen Zielnamen, wenn dort etwas Wichtiges liegt.
Ein Pfad mit Leerzeichen braucht weiterhin Anführungszeichen, genau wie beim Lesen von Dateien:
Copy-Item -LiteralPath './notes with spaces.txt' -Destination ./destination/scratch/notes-demo.txt
cp "notes with spaces.txt" destination/scratch/notes-demo.txt
cp "notes with spaces.txt" destination/scratch/notes-demo.txt
Ohne Anführungszeichen trennt die Shell den Namen an den Leerzeichen. Der Befehl sucht dann eine Datei namens notes.
Löschen
Behandle Löschen an der Befehlszeile als Operation ohne Rückgängig-Funktion. Häufig umgeht es Recycle Bin oder Trash. Ob nach Bestätigung gefragt wird, hängt von Befehl und Konfiguration ab. Du hast final.txt gerade erstellt und brauchst die Datei nicht. Deshalb ist dieser genaue entbehrliche Pfad eine sichere Übung:
Remove-Item -LiteralPath ./destination/scratch/final.txt -WhatIf
Remove-Item -LiteralPath ./destination/scratch/final.txt
Die erste Zeile beschreibt nur, was die zweite tun würde. -WhatIf zeigt eine Vorschau der genannten Operation, reserviert oder schützt das Ziel aber nicht. Prüfe, ob der Pfad den beabsichtigten entbehrlichen Eintrag benennt.
Verwende für ein leeres Verzeichnis Remove-Item -LiteralPath mit dessen genauem Pfad. Anders als Unix-rmdir schützt dieser Befehl nicht dadurch, dass er nur leere Verzeichnisse löscht: Wenn PowerShell fragt, ob Kinder gelöscht werden sollen, antworte No und untersuche das Verzeichnis. Füge in dieser Übung weder -Recurse noch -Force hinzu.
rm destination/scratch/final.txt
rmdir entfernt ein Verzeichnis, und zwar nur ein leeres. Falls noch etwas darin liegt, weigert es sich und meldet das. So lässt sich nützlich prüfen, ob ein vermeintlich leeres Verzeichnis tatsächlich leer ist.
rm destination/scratch/final.txt
rmdir entfernt ein Verzeichnis, und zwar nur ein leeres. Falls noch etwas darin liegt, weigert es sich und meldet das. So lässt sich nützlich prüfen, ob ein vermeintlich leeres Verzeichnis tatsächlich leer ist.
Ctrl+C kann einen noch laufenden Befehl unterbrechen. Es macht weder eine Löschung noch eine andere bereits abgeschlossene Änderung rückgängig.
Die wichtige Gewohnheit ist keine Ängstlichkeit, sondern Genauigkeit: Benenne exakt das, was du meinst. Jeder Löschvorgang hier nennt ein entbehrliches Ziel vollständig. Der gesamte Pfad ist also sichtbar, bevor du die Eingabetaste drückst.
Übung: Ein geprüftes Übungsverzeichnis aufbauen
Bewertet wird der Arbeitsbereich, beginnend bei /workspace. Verwende zuerst Reset, falls ein früherer Versuch destination/file-operations hinterlassen hat.
Arbeite vier Etappen durch und sieh dir nach jeder das Ergebnis an:
Orientieren und Quellen schützen. Bestätige deinen Ort
/workspaceund dassREADME.mdundnotes with spaces.txtbeide vorhanden sind.Vorbereiten und kopieren. Erstelle
destination/file-operations. KopiereREADME.mdalsREADME-copy.mdhinein und lies die Kopie. Kopiere dannnotes with spaces.txtalsnotes-copy.txthinein.Die Kopie verschieben. Benenne
notes-copy.txtinrenamed-notes.txtum. Das bereitgestellte Original bleibt in der Wurzel des Arbeitsbereichs, weil spätere Lektionen es weiterhin lesen.Nur entbehrliche Übungseinträge löschen. Erstelle in
destination/file-operationsein leeres Verzeichnis namensemptyund liste es auf. Entferne es dann mit dem oben erklärten Weg zum Verzeichnislöschen für deine Shell. Erstelle im selben Verzeichnis eine leere Datei namensdelete-me.txt, liste sie auf und entferne dann genau diese Datei. Prüfe abschließend, dass die beiden erforderlichen Dateien bleiben und die beiden entbehrlichen Pfade verschwunden sind.
Bleibe innerhalb von /workspace, benenne jeweils ein Ziel statt mehrere gleichzeitig auszuwählen und lösche aus Schritt 4 ausschließlich destination/file-operations/empty und destination/file-operations/delete-me.txt. Lass README.md und die bereitgestellte Notizdatei unverändert.
Wenn das Verzeichnislöschen vorhandene Inhalte meldet oder nach dem Löschen von Kindern fragt, halte an, statt zu bestätigen. Prüfe den genauen Pfad. Verwende Reset, falls du diesen Übungsarbeitsbereich nicht sicher wiederherstellen kannst. Wenn der Endzustand den vier Etappen entspricht, klicke auf Check my work.
Du verschiebst draft.txt im selben Verzeichnis nach final.txt. Was enthält das Verzeichnis danach?
Die Schritte 2 und 3 verlangen, die Notizdatei zu kopieren und die Kopie umzubenennen, statt das Original umzubenennen. Warum?
Du kannst erstellen, kopieren, verschieben, umbenennen und löschen. Du weißt, welche dieser Operationen das Original erhalten. Als Nächstes geht es um einen Wert, der in der Sitzung statt in einer Datei lebt.