昨天认了目录和 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:
$ 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 复制整个目录
两个参数,运维必须知道
- -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 里没有单独的「重命名」命令,改名就是移动到同一个目录下的新名字。想通这点就不会记混。
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 # 两个一起:删目录且不啰嗦
三条保命规则
把 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/a/b
- 绝对路径——从根目录
/开始写全。在任何位置敲都指向同一个地方。 - a/b
- 相对路径——从当前位置算起。换个目录再敲,指向的就是别的地方了。
- ./a/b
.表示当前目录,和上面那条完全等价,写出来更清楚。- ../lab/a
..表示上一级目录。先退到/tmp,再进lab/a。- ~/文件
~是你自己的家目录。root 是/root,普通用户是/home/用户名。
手动敲命令:用相对路径,省事。
写脚本、写定时任务:一律用绝对路径。因为脚本被执行时的「当前目录」很可能不是你以为的那个——第 25 天讲 crontab 时,你会看到这个坑长什么样。
今天的面试点
别说没有。说没有要么显得没经验,要么显得不诚实。
该答的是你的习惯:「删之前会先用 ls 把通配符匹配的结果看一遍;重要目录先 tar 打包;改配置一定先 cp -a 备份一份带日期的。」
这个回答在说:我知道这事有风险,而且我有防范流程。比背命令有分量得多。
基础答案是「一个复制一个移动」。加上这句会更好:「同一块磁盘内 mv 只是改元数据,瞬间完成;cp 要真读写一遍,大文件差别很明显。」
再补一句 cp -a 保留权限属主——面试官就知道你备份过生产配置。
今天的练习
- 用
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。运维一半的时间花在看日志上,那是真正开始像干活的一天。