Reading Files
The first thing I wanted to do was look inside a file. I knew ls could show me filenames, but I wanted to see what was in them. The command for that is cat.
cat readme.txt It printed the entire file to the screen. For a short file like readme.txt, that worked fine. Then I tried it on a larger file.
cat bundle.js A wall of text blasted past faster than I could read. Hundreds of lines, gone in a blink. I was scrolling frantically when I heard a voice behind me.
Grace Hopper, without turning around:
"Use less. It pages the output. cat is for small files or piping. You will learn piping later."
I tried it.
less bundle.js The file appeared one screen at a time. I could use the arrow keys to scroll up and down, spacebar to jump a full page, and q to quit when I was done. It felt like reading instead of drowning.
Two more commands worth knowing by name: head shows the first few lines of a file, and tail shows the last few. They both take flags to control how many lines. Copilot knows all the details whenever I need them.
Flags — Modifying Commands
Flags are how you modify commands. Single dash for short flags (-f), double dash for long flags (--follow). And here is the trick that changed everything for me: almost every command supports --help. The command can explain itself.
I tried it on git.
git --help A list of the most common subcommands and options git supports appeared. Commands I had never seen before. Options I did not know existed. The terminal was not hiding anything from me — I had not thought to ask.
"The terminal can explain itself." I said it out loud, to no one in particular. For deeper explanations of what specific flags do, Copilot can walk through them in context.
Copying and Moving Files
Copying a file is straightforward. The command is cp, and it takes two arguments: the source and the destination.
cp notes.txt notes-backup.txt Now I had two files. The original was untouched. Over in VS Code, the sidebar updated in real time — notes-backup.txt appeared the moment I ran the command.
Moving a file uses mv.
mv notes-backup.txt archive/notes-backup.txt The file disappeared from the current directory and appeared inside archive/. But then I discovered something that surprised me — mv is also how you rename.
mv old-name.txt new-name.txt There is no separate rename command. Moving a file to a new name in the same directory is renaming. Once I understood that, it made sense — within the same disk, the filesystem does not distinguish between "move" and "rename." Both are just changing where a name points.
Why These Commands Matter
I was practicing — running cp, mv, cat, less — working through the commands Copilot had outlined in Station 1. Prof. Teeters walked by, noticed what I was doing, and paused for exactly one sentence.
"The terminal was here before agents, HAP. Today's best engineers still know the tools themselves."
She moved on. But I sat with that for a minute. I had been learning these commands to understand Copilot. But that was backwards. I should be learning them because I am a developer. The tools are mine, not my agent's.
Removing Files — The Dangerous One
The command is rm. I ran it on a test file I had created.
rm scratch-test.txt Gone. No confirmation dialog. No trash can. No undo. I ran ls and the file was not there. The terminal believed me completely.
I got curious. I had read about flags, and I wanted to see what rm could do with them. I typed:
rm -rf I had not pressed Enter yet. I was going to add a directory name. But before I could finish —
Grace Hopper turned around.
She had been watching. She walked over.
Grace: "Stop. If you finish that command, it will recursively delete everything in that directory and everything inside it. There is no recovery. I have seen it delete entire projects."
"Type
pwdfirst. Read what you are about to remove. Then decide."
I checked pwd — I was pointed at the project root. I cleared the command. Changed to a sandbox directory. Ran it safely.
HAP: "Thank you, Grace."
Grace: "You are welcome, HAP. The flag
-rmeans recursive. The flag-fmeans force — no confirmation. Together they are efficient and unforgiving. Use them only when you are certain."
She returned to her terminal.
That was the only time in the entire lab that Grace left her terminal. I will not forget it.
HAP's Confession:
- I ran
caton a minified JavaScript file — one line, 47,000 characters. Grace sighed. 😳 - I used
mvthinking it was copy — original gone, had to rebuild from VS Code local history. Lesson: commit often. - I almost ran
rm -rfon the project root. Grace turned around.
Station 2 Quick Reference
cat — read a file
Prints the entire file to the screen. Best for short files. For anything longer than a screenful, use less.
less — read a file, paginated
Arrow keys to scroll, spacebar to page down, q to quit. Use this for anything longer than a few lines.
cp source destination — copy a file
Creates a duplicate. The original stays exactly where it is.
mv source destination — move or rename
Moves a file to a new location. Same directory with a new name? That is a rename. There is no separate rename command.
rm file — remove a file (permanent)
No trash. No undo. No confirmation unless you add -i. The flags -r (recursive) and -f (force) are powerful and unforgiving.
Flags and --help
Single dash for short flags (-f), double dash for long flags (--follow). Almost every command supports --help — the terminal can explain itself.
The terminal does not protect you from yourself. That is not a flaw — it is respect. It assumes you know what you are doing. Station 2 taught me to deserve that assumption.
Next: the terminal stops being local.