2.3 安全地操作文件
前置知识:当前目录与路径
预计时间:12 分钟
练习环境:Bash/Zsh 与常见 Unix 命令;所有改动都在临时目录中
完成标志:会创建、查看、复制、移动和安全删除文件
确认当前目录后,再开始修改文件。下面会创建一个一次性练习区:复制、改名和删除都在这里发生,不碰家目录和真实项目。
创建练习区
bash
workdir=$(mktemp -d)
cd "$workdir"
mkdir -p project/{src,test,docs}
touch project/README.mdtouch 会在文件不存在时创建空文件;文件已存在时,默认更新它的时间戳,不会清空内容。
写入和查看
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 . -printmv 既能移动,也能重命名。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/testrmdir 只删除空目录。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"