路径、导航与文件操作
本节目标
在 dev-lab 内区分绝对路径与相对路径,使用 pwd、cd、ls、mkdir、cp 和 mv 管理固定名称的练习文件,并只做受限清理。
开始前状态
你已完成上一节,并准备从 dev-lab 根目录开始。这里的练习目录固定为 paths-practice;如果它已经存在,停止并先检查它的内容,不覆盖也不猜测。
必要原理
绝对路径从根目录开始,例如由 pwd 得到的完整位置;相对路径从当前工作目录开始,例如 paths-practice/source-note.txt。cd 改变当前工作目录,ls 用于观察目录内容。每次改变状态后先观察,能避免在错误位置复制、移动或删除文件。
本节的清理只针对你刚创建且名称已知的文件:rm explicit-known-file。目录为空后才用 rmdir 删除它。不要使用递归删除、通配符删除或管理员权限做普通练习。
课程主线使用 Bash 兼容语法。macOS zsh 同样支持本节的 pwd、cd、ls、mkdir、cp、mv 和 rmdir;显示格式略有差异时,以实际路径和文件名为准。
动手完成
运行位置: dev-lab 根目录。预期输出: pwd 显示练习目录的绝对路径,ls 显示已有的 starter 内容。失败处理: 若当前位置不是 dev-lab,先回到该目录;不要根据记忆拼写或在其他项目中练习。
pwd
ls
lab="$PWD"
printf 'dev-lab 的绝对路径:%s\n' "$lab" >> notes/shell-notes.md
运行位置: 同一个 dev-lab 根目录。预期输出: 新建且为空的 paths-practice 目录。失败处理: 若 ls paths-practice 显示它已存在,停止并检查;本节不提供覆盖命令。
mkdir paths-practice
ls
ls paths-practice
运行位置: 同一个 dev-lab 根目录。预期输出: 固定源文件被复制后再改名,ls 会显示每次变化。失败处理: 若任一命令报错,先运行 pwd 和相应的 ls 确认路径,再逐字核对文件名。
printf '只在 dev-lab 内练习路径。\n' > paths-practice/source-note.txt
ls paths-practice
cp "$lab/paths-practice/source-note.txt" "$lab/paths-practice/copied-note.txt"
ls paths-practice
mv paths-practice/copied-note.txt paths-practice/renamed-note.txt
ls paths-practice
运行位置: 同一个 dev-lab 根目录。预期输出: 进入相对路径后,pwd 显示绝对路径;回到上一级后可再次看到练习目录。失败处理: 如果 cd .. 后的位置意外,使用 pwd,不要继续执行文件操作。
cd paths-practice
pwd
ls
cd ..
pwd
find paths-practice -maxdepth 1 -type f -print | sort
运行位置: dev-lab 根目录。预期输出: 两个路径练习文件、两个 Shell 流文件和临时观察笔记依次删除,空目录随后被 rmdir 移除,最后的 find 不包含 paths-practice 或 shell-notes.md。失败处理: 只在 ls paths-practice 与示例一致时继续;名称不一致时停止,不使用通配符或递归删除。
rm output/shell-stdout.txt
rm output/shell-stderr.txt
ls output
rm paths-practice/source-note.txt
ls paths-practice
rm paths-practice/renamed-note.txt
ls paths-practice
rmdir paths-practice
rm notes/shell-notes.md
ls notes
find . -maxdepth 2 -print | sort
清理确认后,回到保存下载的权威 check-starter.sh 与 dev-lab 的父目录,运行下方 starter checker。它只读取目录;预期输出必须是 starter checkpoint: ok。
观察结果
变量 lab 保存的是开始时的绝对路径,因此 cp 使用完整位置;paths-practice/... 是相对路径,依赖你仍在 dev-lab。mv 改变文件名而非复制内容。清理结束后,练习目录、两个路径临时文件、两个 Shell 流文件和临时观察笔记都不再存在,starter 文件恢复为可检查的状态。
常见问题
为什么每一步都要 ls 或 find? 文件操作会改变状态。先观察能证明下一条命令的目标存在且名称正确,尤其是在清理之前。
可以一次删掉整个练习目录吗? 不可以。本节只练习明确已知的两个文件和一个确认为空的目录;更复杂的清理需要先学习相应边界。
完成检查
- 能用
pwd说出dev-lab的绝对路径,并用相对路径进入练习目录; - 已创建、复制和移动固定文件,并在每次状态变化后用
ls或find观察; - 已用
rm output/shell-stdout.txt、rm output/shell-stderr.txt、rm paths-practice/source-note.txt、rm paths-practice/renamed-note.txt和rm notes/shell-notes.md明确移除临时文件,再用rmdir paths-practice移除空目录; find . -maxdepth 2 -print | sort不再显示paths-practice或shell-notes.md,starter checker 仍可通过。
下一步
下一节会在同一练习目录中查看、搜索和处理文本;仍然先确认路径和已有文件,再执行操作。