De opdrachtregel · oefening
Maken, kopiëren, verplaatsen en verwijderen
Je moet vanuit een shell bestanden opnieuw ordenen. Misschien ben je hier rechtstreeks vanuit een andere cursus terechtgekomen. Vier bewerkingen dekken bijna alles: maken, kopiëren, verplaatsen en verwijderen. Elke bewerking verandert de structuur, dus controleer telkens achteraf of die heeft gedaan wat je bedoelde.
De terminal naast deze les bevat een tijdelijk gehost oefenproject in /workspace, los van je eigen computer. Voer de voorbeelden en de beoordeelde oefening daar uit. Voordat je iets verandert, moet je je locatie kunnen controleren, navigeren, de inhoud van een map opvragen en een bestand lezen waarvan het pad tussen aanhalingstekens staat. Heb je dat nog niet gedaan, volg dan deze lessen op volgorde en kom hier terug:
Kopiëren
Een kopie laat het origineel ongemoeid en maakt ergens anders een tweede item. Begin in /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 is de bron en -Destination is waar de kopie terechtkomt. Beide benoemen voorkomt dat je ze omdraait. Dat is de fout waartoe deze opdracht uitnodigt.
mkdir destination/scratch
cp README.md destination/scratch/readme-demo.md
cat destination/scratch/readme-demo.md
cp krijgt eerst de bron en daarna de bestemming. Niets in de regel herinnert je eraan welke welke is. Die volgorde moet je dus zelf onthouden; ze omdraaien is de fout waartoe deze opdracht uitnodigt.
mkdir destination/scratch
cp README.md destination/scratch/readme-demo.md
cat destination/scratch/readme-demo.md
cp krijgt eerst de bron en daarna de bestemming. Niets in de regel herinnert je eraan welke welke is. Die volgorde moet je dus zelf onthouden; ze omdraaien is de fout waartoe deze opdracht uitnodigt.
De kopie achteraf lezen kost één opdracht en laat je een verkeerd getypte bestemming ontdekken. Anders blijft die fout veel langer onzichtbaar.
Verplaatsen is ook hernoemen
Verplaatsen verandert het pad van een item. Dat omvat twee taken die mensen vaak als afzonderlijk zien: geef het bestand een andere map en het wordt verplaatst; geef het binnen dezelfde map een andere naam en het wordt hernoemd. Voor beide gebruik je één opdracht, omdat ze voor het bestandssysteem dezelfde wijziging zijn.
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
Het overzicht toont final.txt en geen draft.txt. Dat is het zichtbare verschil met kopiëren: in dit voorbeeld binnen hetzelfde bestandssysteem bestaat nu het bestemmingspad en niet meer het bronpad.
Let op één ding: shells hanteren niet allemaal dezelfde regel als de bestemming al bestaat. PowerShells Move-Item geeft normaal een fout wanneer de doelbestandsnaam al bestaat, terwijl gangbare Unix-implementaties van mv een bestaand bestand kunnen vervangen. De veilige regel werkt overal: bekijk de bestemming voordat je verplaatst en kies een nieuwe doelnaam als er al iets belangrijks staat.
Een pad met spaties moet nog steeds tussen aanhalingstekens staan, precies zoals bij het lezen van bestanden:
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
Zonder de aanhalingstekens splitst de shell de naam bij de spaties en gaat de opdracht op zoek naar een bestand met de naam notes.
Verwijderen
Behandel verwijderen op de opdrachtregel als een bewerking die je niet ongedaan kunt maken. Die slaat de Prullenbak vaak over. Of je om bevestiging wordt gevraagd hangt af van de opdracht en de instellingen. Je hebt zojuist final.txt gemaakt en hebt het niet nodig. Daarom is dit exacte tijdelijke pad geschikt om veilig mee te oefenen:
Remove-Item -LiteralPath ./destination/scratch/final.txt -WhatIf
Remove-Item -LiteralPath ./destination/scratch/final.txt
De eerste regel doet niets behalve beschrijven wat de tweede zou doen. -WhatIf geeft een voorvertoning van de genoemde bewerking, maar reserveert of beschermt het doel niet. Controleer of het pad verwijst naar het tijdelijke item dat je bedoelde.
Gebruik voor een lege map Remove-Item -LiteralPath met het exacte pad van die map. Anders dan Unix-rmdir beschermt dit je niet doordat het uitsluitend lege mappen verwijdert. Vraagt PowerShell of het ook onderliggende items moet verwijderen, antwoord dan No (nee) en bekijk de mapinhoud. Voeg in deze oefening geen -Recurse of -Force toe.
rm destination/scratch/final.txt
rmdir verwijdert een map, maar alleen een lege. Zit er nog iets in, dan weigert de opdracht dat en meldt het. Dat maakt het een nuttige manier om te ontdekken of een map die je leeg acht dat ook werkelijk is.
rm destination/scratch/final.txt
rmdir verwijdert een map, maar alleen een lege. Zit er nog iets in, dan weigert de opdracht dat en meldt het. Dat maakt het een nuttige manier om te ontdekken of een map die je leeg acht dat ook werkelijk is.
Ctrl+C kan een opdracht onderbreken die nog draait. Het maakt een verwijdering of andere wijziging die al klaar is niet ongedaan.
De gewoonte om vast te houden is geen angst, maar precisie: benoem exact wat je bedoelt. Elke verwijdering hier noemt één tijdelijk doel volledig, zodat het hele pad zichtbaar is voordat je op Enter drukt.
Oefening: bouw een gecontroleerde oefenmap
Deze oefening wordt beoordeeld op basis van de werkruimte en begint in /workspace. Gebruik eerst Reset als een eerdere poging destination/file-operations heeft achtergelaten.
Werk vier stappen af en bekijk na elke stap het resultaat:
Oriënteer je en bescherm de bronnen. Controleer of je in
/workspacestaat en of zowelREADME.mdalsnotes with spaces.txtaanwezig is.Bereid voor en kopieer. Maak
destination/file-operations. KopieerREADME.mdernaartoe alsREADME-copy.md, lees de kopie en kopieer daarnanotes with spaces.txternaartoe alsnotes-copy.txt.Verplaats de kopie. Hernoem
notes-copy.txtnaarrenamed-notes.txt. Het meegeleverde origineel blijft in de hoofdmap van de werkruimte, omdat latere lessen het nog lezen.Verwijder alleen tijdelijk oefenmateriaal. Maak binnen
destination/file-operationseen lege map met de naamemptyen controleer die in een overzicht. Verwijder die daarna via de hierboven beschreven werkwijze voor jouw shell. Maak en bekijk in dezelfde map een leeg bestand met de naamdelete-me.txten verwijder vervolgens exact dat bestand. Controleer tot slot of de twee vereiste bestanden er nog zijn en de twee tijdelijke paden verdwenen zijn.
Blijf binnen /workspace, benoem één doel tegelijk in plaats van meerdere tegelijk te selecteren en verwijder niets behalve destination/file-operations/empty en destination/file-operations/delete-me.txt uit stap 4. Laat README.md en het meegeleverde notitiebestand ongewijzigd.
Meldt het verwijderen van een map dat er nog inhoud is, of vraagt de opdracht of onderliggende items verwijderd moeten worden, stop dan in plaats van te bevestigen. Bekijk het exacte pad. Gebruik Reset als je deze tijdelijke werkruimte niet met zekerheid kunt herstellen. Druk op Check my work wanneer de eindtoestand aan de vier stappen voldoet.
Je verplaatst draft.txt naar final.txt binnen dezelfde map. Wat bevat de map daarna?
In stap 2 en 3 kopieer je het notitiebestand en hernoem je de kopie, in plaats van het origineel te hernoemen. Waarom?
Je kunt maken, kopiëren, verplaatsen, hernoemen en verwijderen. Je weet ook welke bewerkingen het origineel laten staan. Hierna volgt een waarde die in de sessie leeft in plaats van in een bestand.