一:以为 rm 有回收站
现象:文件删了想找回来,发现根本没有回收站。
原因:rm 是 remove 的缩写,直接删除对象,默认没有回收站。
课件给的安全用法:
- 初学阶段和重要文件一律用 rm -i,删除前逐个询问。
- 配上 -v 显示实际删除对象,便于核对。
- -r 删除目录前,先确认完整路径和目录内容。
删除前固定三步:确认当前目录;查看命令将要处理的实际对象(可以用 ls -d 加路径模式先看一眼);只在确定的实验目录中执行删除。
二:-f 和不确定的路径组合
现象:一条 rm -rf 加变量或通配符,删掉了意料之外的东西。
课件原话:-f 不询问、强制处理,自动化中才按需使用,不能与不确定路径组合;不要把不确定的批量匹配、空变量和递归删除直接组合执行;也不要在根目录或系统目录练习递归删除。
正确姿势(课件实验的顺序):先 touch 造几个确定的临时文件,用 ls -d 确认匹配到的就是这几个,再 rm -iv 逐个确认删除。练目录删除时,用专门的临时目录(如 ~/magedu/day05/delete-test),删完用 ls -ld 验证目录已不存在。
三:cp 覆盖了同名文件才发现
现象:复制时目标已有同名文件,被悄悄盖掉,内容丢了。
课件的标准实验:dir2/file1.txt 内容是 old,dir1/file1.txt 内容是 new,用 cp -iv 复制时先出现覆盖提示。输入 n 不覆盖,cat 确认目标仍是 old;确认确实要覆盖再执行并输入 y。
更重要的认知:脚本和自动化环境不能依赖交互询问,没有人回答 y。所以批量覆盖前必须先确认源、目标和影响范围,把确认做在执行前,而不是指望 -i 救场。
四:把硬链接当备份
现象:给重要文件建了个硬链接,以为这就是备份,后来源文件内容改了或者误改了,硬链接看到的也变了。
原因:硬链接是同一个 inode 的另一个文件名,两个名称没有主次之分,修改其中任意一个名称,看到的都是同一份数据。课件明确说:它不是独立备份,因为通过任意名称修改内容都会影响同一份数据。
正确认知:硬链接的价值是同一文件系统内为普通文件增加入口、删一个名字数据不丢(链接数大于 0 时仍可访问)。需要真正备份,仍应复制内容并验证恢复。
五:想给目录建硬链接,或硬链到别的文件系统
现象一:ln 目录名 目录别名,系统直接拒绝。
原因:目录树需要保持清晰的父子结构,任意目录都能加硬链接就可能形成环路,路径遍历和父子判断都会混乱。现代 Linux 禁止用户自行创建目录硬链接,root 用普通 ln 也绕不过。目录里的 . 和 .. 是文件系统维护的,不算手工硬链接。
现象二:把硬链接建到 /dev/shm,报 Invalid cross-device link。
原因:inode 编号只在所属文件系统内有效,/dev/shm 是独立的内存文件系统,有自己的 inode 表。可用 df -T 路径1 路径2 先确认两个位置是否同一文件系统。
这两个限制正是符号链接存在的理由:符号链接保存的是目标路径,可以指向目录、可以跨文件系统。
六:符号链接断了,或删链接时把目标删了
两个子坑:
子坑一:删除符号链接时在链接名后加了 /,行为可能不符合预期。课件明确:删除符号链接应删除链接本身,不要在链接名后添加 /。rm link1 删的是链接,目标文件仍然存在。操作前用 ls -l 确认当前对象确实是链接(首字符是 l)。
子坑二:目标被改名、移动或删除后,链接还在但访问不到目标,这就是断链。课件实验:先 ln -s target.txt entry.txt,readlink -f 还能解析出完整路径;把 target.txt 改名成 target.moved 后,entry.txt 本身还在,但 readlink -f 无法再解析到目标。
排查方法:先用 readlink 查看链接中保存的路径,再确认目标是否被改名、移动或删除。修复时只调整链接或恢复目标,不要盲目重建整个应用目录。
另一个相关细节:current 保存的是绝对路径,方便当前主机排查;但把目录迁移到其他位置时需要重新建立链接。恢复归档后要证明版本文件已恢复,直接读恢复目录里的文件(如 restore/ruoyi/releases/1.0.0/index.html),而不是只看链接。
七:生成压缩包就以为备份完成了
现象:tar -czf 一跑完就放心了,等真要用时发现包坏了、内容不全,或者直接 tar -xzf 解到原目录把现场盖了。
课件两句话点破:
- 归档和压缩不是一回事:归档只是把多个对象组织成一个文件,体积通常不会明显变化;压缩才尝试减少存储空间,而且 JPG 等已压缩格式收益很小。
- 归档完成不等于备份可用:成功生成压缩包并不等于备份可用,还要查看内容并实际恢复。
标准恢复流程:先 tar -tzf 查看归档内容;mkdir 建一个空目录;tar -xzf 提取到空目录(用 -C 指定),不要直接覆盖原目录;最后核对恢复出的文件内容。四步形成恢复证据:创建、归档、提取、比较。
八:find 批量操作翻车,以及时间、通配符的小陷阱
这三个坑都出在动手太快:
陷阱一:-exec 直接上。课件铁律:先用 -print 验证结果,再加入执行动作;涉及删除、覆盖时仍然遵守先打印结果、检查搜索起点和条件、再执行动作。
陷阱二:mtime 按日历日期理解。课件明确:mtime 按 24 小时区间计算,不应简单理解为日历日期。-mmin -30 是最近 30 分钟,-mtime -7 是最近 7 个 24 小时区间内,-mtime +7 是超过相应区间。
陷阱三:通配符没加引号。'*.log' 要加引号,避免星号先被当前 Shell 展开。同理,find 里的圆括号前要加反斜线,避免括号被 Shell 提前解释。
补充两个容易忽视的点:
- 通配符本身不负责递归进入子目录;批量复制、移动、删除前,先 ls -d 查看实际展开结果。花括号展开(如 file{1..3}.txt)与通配符不同,它直接生成名称、不检查文件是否存在。
- 管道接 xargs 时,名称带空格的文件(如课件里的 file yangge.txt)会被按空白拆成两个参数导致报错;稳妥做法是 find -print0 配 xargs -0,两端都用 NUL 字符分隔。