← 回目录
02 Week 01 · 先能动手

增删改查:文件怎么折腾

建、拷、改名、删。命令本身十分钟就会,难的是不出事故——今天有一半篇幅在讲怎么别把自己坑了。

昨天认了目录和 ls,今天开始动手改东西。五个命令,外加一个昨天埋下的伏笔:绝对路径和相对路径

今天要敲的
$ mkdir -p /tmp/lab/a/b       # -p 一次建多层
$ touch /tmp/lab/test.txt
$ cp /etc/hosts /tmp/lab/
$ mv /tmp/lab/test.txt /tmp/lab/new.txt
$ rm -rf /tmp/lab/a           # 删目录,慎用

mkdir

建目录

make directory。直接建一个目录,没什么好说的。关键是 -p

有没有 -p 的区别
$ mkdir /tmp/lab/a/b
mkdir: cannot create directory '/tmp/lab/a/b': No such file or directory
  ↑ 因为上级目录 /tmp/lab/a 还不存在

$ mkdir -p /tmp/lab/a/b       # 一路建下去,缺哪层补哪层
$

-p 还有个隐藏好处:目录已经存在时不会报错。所以写脚本时一律用 mkdir -p,不用先判断目录在不在。

touch

建空文件,顺便改时间

建一个空文件。但 touch 的本职工作其实是改文件的时间戳——文件不存在时才顺手建一个。

两种用法
$ touch /tmp/lab/test.txt     # 不存在 → 建一个空文件
$ touch /tmp/lab/test.txt     # 已存在 → 把修改时间刷成现在
$ ls -l /tmp/lab/test.txt     # 看时间变了没
和昨天连起来

昨天说 ls -lt 能按修改时间找出「最近被谁动过」。touch 正好能改这个时间——所以排障时看到的时间戳,理论上是可以被人为改掉的。知道这点就行,不用多想。

cp

复制 —— 运维最该养成的习惯在这
基本用法
$ cp /etc/hosts /tmp/lab/          # 复制文件到目录
$ cp /etc/hosts /tmp/lab/hosts.bak # 复制并改名
$ cp -r /etc/nginx /tmp/lab/       # -r 复制整个目录

两个参数,运维必须知道

cp -a 源 目标 # archive,归档模式
-r
递归复制目录。复制目录必须加,不加会直接报错。
-p
保留权限、属主、时间戳。不加的话,复制出来的文件属主会变成你自己、时间变成现在。
-a
等于 -r-p 再加保留软链接。备份配置目录就用它,一个参数搞定。
-i
目标已存在时先问一句再覆盖。手动操作时值得加。
这个习惯能救你一次职业生涯

改任何配置文件之前,先备份一份。这是运维最基本的素养,也是面试时体现「有没有实际经验」的地方。

标准写法是带上日期:

改配置前的标准动作
$ cd /etc/nginx
$ sudo cp -a nginx.conf nginx.conf.bak.$(date +%F)
$ ls -l nginx.conf*
-rw-r--r--. 1 root root 2334 Sep  7 10:12 nginx.conf
-rw-r--r--. 1 root root 2334 Sep  7 10:12 nginx.conf.bak.2026-09-07
  ↑ 改坏了随时能拷回来

$(date +%F) 是把当天日期插进文件名,结果就是 2026-09-07。这个写法第 26 天学脚本时还会用到。

mv

移动,同时也是改名

move。这个命令身兼两职,很多人一开始转不过弯:

同一个命令,两件事
$ mv /tmp/lab/test.txt /tmp/lab/new.txt
  ↑ 同一个目录内 → 这是「改名」

$ mv /tmp/lab/new.txt /tmp/
  ↑ 换了个目录 → 这是「移动」

Linux 里没有单独的「重命名」命令,改名就是移动到同一个目录下的新名字。想通这点就不会记混。

和 cp 的区别

mv同一块磁盘内只是改个记录,瞬间完成,多大的文件都一样快。cp 是真的读一遍写一遍,几十 G 的文件要等很久。

rm

删除 —— 今天最危险的一节

先说清楚:Linux 没有回收站。rm 删掉的东西,普通手段找不回来。

三个参数
$ rm /tmp/lab/new.txt      # 删文件
$ rm -r /tmp/lab/a         # -r 删目录(递归)
$ rm -f /tmp/lab/xxx       # -f 强制,不存在也不报错
$ rm -rf /tmp/lab/a        # 两个一起:删目录且不啰嗦

三条保命规则

规则一 · 删之前先 ls

rm 换成 ls 先跑一遍,确认列出来的正是你要删的,再改回 rm。尤其是带通配符的时候。

带 * 的时候一定要先看
$ ls /tmp/lab/*.log        # 先看:到底会匹配到哪些
$ rm /tmp/lab/*.log        # 确认没问题了再删
规则二 · 小心空格

这是最经典的事故:rm -rf /tmp/lab /*——本来想删 /tmp/lab/*,手一抖多打个空格,变成了删根目录下的一切

所以:删之前先 pwd 确认位置,用相对路径少打字、少出错。

规则三 · 大目录先打包再删

重要目录不确定能不能删,先 tar 打个包放着:tar czf /tmp/backup.tar.gz /etc/nginx。占不了多少空间,但后悔的时候能救命。

绝对路径 vs 相对路径

昨天埋的伏笔,今天填上

昨天讲 pwd 时提过一句,今天正式说清楚。

假设你现在在 /tmp/lab,想访问 /tmp/lab/a/b
/tmp/lab/a/b
绝对路径——从根目录 / 开始写全。在任何位置敲都指向同一个地方。
a/b
相对路径——从当前位置算起。换个目录再敲,指向的就是别的地方了。
./a/b
. 表示当前目录,和上面那条完全等价,写出来更清楚。
../lab/a
.. 表示上一级目录。先退到 /tmp,再进 lab/a
~/文件
~你自己的家目录。root 是 /root,普通用户是 /home/用户名
什么时候用哪个

手动敲命令:用相对路径,省事。

写脚本、写定时任务一律用绝对路径。因为脚本被执行时的「当前目录」很可能不是你以为的那个——第 25 天讲 crontab 时,你会看到这个坑长什么样。

今天的面试点

答的是习惯,不是命令
「你误删过东西吗?」

别说没有。说没有要么显得没经验,要么显得不诚实。

该答的是你的习惯:「删之前会先用 ls 把通配符匹配的结果看一遍;重要目录先 tar 打包;改配置一定先 cp -a 备份一份带日期的。」

这个回答在说:我知道这事有风险,而且我有防范流程。比背命令有分量得多。

「cp 和 mv 有什么区别?」

基础答案是「一个复制一个移动」。加上这句会更好:「同一块磁盘内 mv 只是改元数据,瞬间完成;cp 要真读写一遍,大文件差别很明显。」

再补一句 cp -a 保留权限属主——面试官就知道你备份过生产配置。

今天的练习

敲完再走 · 约 10 分钟
  • mkdir -p 一次建出 /tmp/lab/a/b/c 三层目录
  • /etc/hosts 复制到 /tmp/lab,然后 ls -l 对比两个文件的属主有没有变
  • 再用 cp -a 复制一次,看这回属主和时间戳保住了没
  • 练一次备份写法:cp -a /etc/hosts /tmp/lab/hosts.bak.$(date +%F)
  • 把某个文件 mv 改个名,再 mv 到上一级目录,体会「同一个命令两件事」
  • 删之前先 ls /tmp/lab/* 看一遍,确认后再 rm -rf /tmp/lab/a
明天预告

Day 03 讲看日志,重点是 tail -f运维一半的时间花在看日志上,那是真正开始像干活的一天。