文件与目录操作命令速查:ls、cp、mv、rm、find、tar 一篇搞定
运维学习路线系列 · 阶段一 Linux 地基 · 第 2 篇
适用环境:Ubuntu 24.04 LTS,普通用户(有 sudo)
阅读前提:《S1-01 文件系统与目录结构》
前言:rm -rf 的恐怖故事先听一个
新员工第一天,想在测试机清理一个目录,手速极快地敲了:
rm-rf/ data/app/log# 本意:rm -rf /data/app/log,多打了一个空格空格一隔,rm收到两个参数:/和data/app/log。幸好系统还有一丝防护,但/etc下已经少了东西,机器重装收场。
文件操作命令是双刃剑:日常 80% 的操作是它们,90% 的"惨案"也是它们。这篇按"看 → 搬 → 删 → 找 → 打包"的动线把高频命令过一遍,每个都标注哪个参数能救命。
一、看:ls 系列
ls# 列出当前目录ls-l# 长格式:权限、属主、大小、时间(ll 是它的常用别名)ls-a# 含隐藏文件(. 开头)ls-lh# -h 人类可读大小(K/M/G),看日志大小必用ls-lt# 按修改时间倒序(最新的在最上面)——找"刚生成的文件"神器ls-lS# 按大小倒序——找"谁把磁盘吃满了"神器ls-ld/etc# -d 只看目录本身,不看目录内容ls-R/etc/nginx# 递归列出子目录(大目录慎用)ls -l输出逐字段解读(务必认识每一个):
-rw-r--r-- 1 root root 1070 Oct 20 14:00 nginx.conf └─类型权限 └─链接数 └─属主 └─属组 └─大小(B) └─修改时间 └─文件名首字符类型速记:-普通文件 /d目录 /l软链接 /b块设备(硬盘)/c字符设备(终端)。权限字段(rw-那三组)下一篇《S1-03 权限》专门讲。
二、搬:cp、mv、scp
2.1 cp 复制
cpa.txt b.txt# 复制文件cp-rdir1 dir2# -r 递归复制目录(没有 -r 复制目录会报错)cp-pa.txt b.txt# -p 保留权限/属主/时间戳(备份配置文件用)cp-ia.txt b.txt# 目标存在时询问(Ubuntu 默认 cp 就带 -i 别名)cp-adir1 dir2# -a 归档模式 = -r + -p + 保留链接,最完整的复制🚨cp会静默覆盖同名目标文件(带-i别名的发行版除外)。往配置目录复制前,先ls确认目标。
2.2 mv 移动 / 重命名
mva.txt /tmp/# 移动mva.txt b.txt# 重命名(同目录下 mv = 改名)mvdir1 /opt/# 目录移动不需要 -r特点:同文件系统内mv是改路径指针,瞬间完成,大文件也是;跨文件系统则等价于"复制 + 删除",大文件要等。
2.3 scp:机器之间搬文件
# 推:把本机文件传到远程scpbackup.sh user@192.168.1.11:/opt/scripts/# 拉:把远程文件拉回本机scpuser@192.168.1.11:/etc/nginx/nginx.conf ./# 目录加 -r;指定端口加 -P(注意是大写 P)scp-r-P2222./logs/ user@192.168.1.11:/data/三、删:rm 与它的安全带
rma.txt# 删文件rm-rdir1# 递归删目录rm-fa.txt# -f 强制(不存在也不报错)rm-ia.txt# 逐个确认(谨慎场景用)rm-rfdir1# 递归强删——就是恐怖故事的主角3.1 🚨 rm 的三条安全带
变量为空判断:
rm -rf $LOG_DIR/若$LOG_DIR为空就变成rm -rf /。脚本里必须:[[-n"$LOG_DIR"]]||{echo"LOG_DIR 未设置";exit1;}rm-rf"${LOG_DIR:?LOG_DIR is empty}"/*# 参数为空时 bash 直接报错拒绝执行先看再删:删之前用
ls替换rm跑一遍路径——确认列表没毛病,再把命令改回rm。通配符前禁用变量拆词:
rm -rf $DIR/*(不带引号)在$DIR含空格时路径会劈叉。一律写rm -rf "$DIR"/*。
想要"回收站"?可以装
trash-cli(sudo apt install trash-cli,用trash-put代替rm)——个人机器友好,但服务器上不一定让装,真正的回收站是备份。
4️⃣ 顺带一提:rmdir 和 mkdir
mkdir-p/data/app/{logs,conf,bin}# -p 建多级 + 花括号展开一次建三个rmdiremptydir# 只删空目录,安全但用处少四、找:find——命令行里的搜索引擎
# 基本三要素:路径 + 条件 + 动作find/var/log-name"*.log"# 按名字find/etc-iname"*NGINX*"# 忽略大小写find/-typef-size+100M# 全盘找大于 100M 的普通文件(磁盘告警第一步!)find/data-mtime+7# 7 天前修改过的find/tmp-mmin-30# 30 分钟内修改过的(找"刚出事"的文件)find/opt-userwww-data# 按属主找4.1 组合技:-exec 和 xargs
# 找到并直接处理:{} 占位,\; 结尾find/data/logs-name"*.log"-mtime+30-execls-lh{}\;# 批量删除 30 天前的日志(经典运维任务)find/data/logs-name"*.log"-mtime+30-delete# 文件名带空格也安全的 xargs 写法find/data-name"*.tmp"-print0|xargs-0rm-f🚨find ... -delete在多条件场景建议先去掉-delete用-ls跑一遍,确认范围后再删。它和rm -rf是同级别的危险命令。
4.2 locate:先建索引再秒查
sudoaptinstallplocate-ysudoupdatedb# 全盘建索引locatenginx.conf# 秒出结果(不实时,索引每日更新)选择:
locate快但可能过期;find慢但是实时。排错找"刚才生成的文件"用 find,找"系统里装在哪"用 locate。
五、打包压缩:tar 三板斧
Linux 世界.tar.gz/.tgz是通用格式,打包和压缩是两件事——tar 只打包(把一堆文件卷成一个),gz 才是压缩。
# 打包 + 压缩(czf = create + gzip + file)tarczf backup-$(date+%F).tar.gz /data/app# 看包里有什么(不解压)tartzf backup-2026-10-20.tar.gz|head# 解压到指定目录(xf = extract + file,自动识别压缩格式)mkdir/tmp/restore&&tarxzf backup-2026-10-20.tar.gz-C/tmp/restore# 只解压包里的某一个文件tarxzf backup-2026-10-20.tar.gz-C/tmp/restore data/app/nginx.conf| 参数 | 全称 | 作用 |
|---|---|---|
c | create | 创建包 |
x | extract | 解包 |
t | list | 列出内容 |
z | gzip | 用 gzip 压/解压(.tar.gz) |
j | bzip2 | 用 bzip2(.tar.bz2,更小更慢) |
J | xz | 用 xz(.tar.xz,最小最慢) |
f | file | 指定文件名,必须放最后(-f后面紧跟文件名) |
-C | directory | 解压到指定目录 |
--exclude | 排除 | tar czf a.tgz /data --exclude=/data/logs |
🚨tar xzf直接在当前目录解包会"炸一地"文件,规范操作永远是:mkdir 目标目录 && tar xzf 包 -C 目标目录。
其他格式速记(碰到了别懵):
gzipa.txt# 单文件压缩 → a.txt.gz(源文件没了)gunzip a.txt.gz# 解压zip-rdir.zip dir/# 与 Windows 互通用 zipunzipdir.zip-dout/# 解压 zip六、软链接与硬链接:ln
ln-s/data/app/current/logs /var/log/myapp# 软链接(最常用)ln/data/a.txt /backup/a.txt# 硬链接(少用)| 软链接 | 硬链接 | |
|---|---|---|
| 本质 | 指向路径的快捷方式 | 同一份数据的第二个名字 |
| 跨文件系统 | ✅ | ❌ |
| 链接目录 | ✅ | ❌ |
| 源被删后 | 失效(红底白字悬空) | 依然可用(数据还在) |
💡 运维高频用法:
/etc/nginx下的sites-enabled/里全是指向sites-available/的软链接——“启用某站点” = 建软链接,这是 Debian 系配置管理的经典套路。软链接必须用绝对路径创建,相对路径的软链接换个目录引用就断了。
七、综合实战:磁盘告警时的标准动作
把本篇命令串成一个真实工作流(模拟你 Runbook 里"磁盘 85%"场景):
# ① 全盘找大文件(top 10)sudofind/-xdev-typef-size+100M-execls-lh{}\;2>/dev/null|sort-k5-h|tail-10# ② 日志目录里谁最大du-sh/var/log/*|sort-h|tail-5# ③ 确认后打包带走再删(留现场证据)sudotarczf /root/old-logs-$(date+%F).tar.gz /var/log/app/sudorm-rf/var/log/app/*.log.1# ④ 建立长效机制 → 这是第 8 篇 logrotate 的活验收标准:不看文章能写出——① 找出全盘前 10 大文件;② 把/data/app打包成带日期的 tar.gz;③ 安全删除 30 天前的日志(先预览再删)。
八、🚨 避坑清单
| # | 坑 | 后果 | 正确姿势 |
|---|---|---|---|
| 1 | rm -rf / xx多空格 | 🚨 灾难 | 危险命令敲完停 1 秒再回车;路径用引号 |
| 2 | 变量为空 +rm -rf $DIR/ | 🚨 灾难 | ${DIR:?}防空语法 |
| 3 | tar xzf在当前目录裸解 | 文件炸一地 | -C 目标目录 |
| 4 | cp静默覆盖 | 配置被顶掉 | 覆盖前ls;重要目录用cp -a前先备份 |
| 5 | 相对路径软链接 | 移动后断链 | ln -s一律用绝对路径 |
| 6 | find /不加-xdev | 扫进 /proc、跨挂载点,慢且报错刷屏 | 全盘扫描加-xdev+2>/dev/null |
| 7 | 删日志销毁现场 | 故障没法复盘 | 大日志先打包留存再删 |
| 8 | scp -p当指定端口 | 卡死(小写 -p 是保留时间戳) | scp 端口用大写 -P,ssh 才是小写 -p |
九、一句话总结
先看(ls -lht)再动(cp/mv 带 -a/-i),删除前先预览,打包必进目录(-C),全盘找文件 -size +100M——文件操作的安全感来自流程,不是手速。
💬 互动
你经历过最惊险的 rm 是哪次?是删错了环境(生产当测试删),还是多打了一个空格?评论区讲讲,让大伙儿引以为戒。
下一篇预告:《S1-03 Linux 用户、组与权限:chmod、chown、sudo、umask 一文搞懂》——
ls -l里那串rw-r--r--到底怎么读、Permission denied到底怪谁。