跳到内容

第 0 卷 / 第 2 章 / 第 3 课

2.3 安全地操作文件 ​

前置知识:当前目录与路径

预计时间:12 分钟

练习环境:Bash/Zsh 与常见 Unix 命令;所有改动都在临时目录中

完成标志:会创建、查看、复制、移动和安全删除文件

确认当前目录后,再开始修改文件。下面会创建一个一次性练习区:复制、改名和删除都在这里发生,不碰家目录和真实项目。

创建练习区 ​

bash
workdir=$(mktemp -d)
cd "$workdir"
mkdir -p project/{src,test,docs}
touch project/README.md

touch 会在文件不存在时创建空文件;文件已存在时,默认更新它的时间戳,不会清空内容。

写入和查看 ​

bash
printf '%s\n' 'Hello Workshop!' > project/README.md
printf '%s\n' 'Second line' >> project/README.md
cat project/README.md
head -n 1 project/README.md
  • > 创建或覆盖目标文件。
  • >> 追加到文件末尾。
  • cat 适合短文本;大文件可用 less 分页查看。

echo 的转义和选项行为存在实现差异,脚本需要精确输出时优先使用 printf。

复制、移动与重命名 ​

bash
cp project/README.md project/docs/README.copy.md
mv project/docs/README.copy.md project/docs/guide.md
cp -R project/docs project/docs-backup
find . -print

mv 既能移动,也能重命名。cp -R 递归复制目录,但元数据、链接和扩展属性的处理会因选项和平台而异,不应代替正式备份工具。

空格和以连字符开头的文件名 ​

bash
touch 'project/My Important File.txt'
touch 'project/-draft'
ls -l -- 'project/My Important File.txt' 'project/-draft'
rm -- 'project/My Important File.txt'
rm -- 'project/-draft'

touch My Important File.txt 会把空格当成参数分隔,创建三个文件。引用整个路径可保留空格。-- 结束选项解析,避免直接传入 -draft 时把它当作选项。本例使用的 project/-draft 本身不以 - 开头,所以目录前缀也起到了区分作用。

删除没有撤销键 ​

bash
rm project/docs/guide.md
rmdir project/test

rmdir 只删除空目录。rm -r 会递归删除目录树,通常不进入回收站。不要通过执行 rm -rf / 来观察保护机制;实现、权限和挂载环境都会影响后果。

删除目录前采用四步检查:

bash
target="$workdir/project/docs-backup"
pwd
ls -ld -- "$target"
find "$target" -print
rm -r -- "$target"

rm -i 的询问能减少手误,但不是安全边界。脚本、别名和不同实现可能让它表现不同。

最后清理:

bash
cd
ls -ld -- "$workdir"
rm -r -- "$workdir"

→ 下一步:环境变量和 PATH

Built with VitePress | Software Systems Atlas