我备考RH124的时候,第三章“从命令行管理文件”一开始是被我当成“最简单的操作课”跳过的。毕竟创建、复制、移动、删除文件这些动作,谁在Linux里没做过几次?真正让我改变看法的是一次实验事故:我在/tmp下建了一整套测试目录,想清理垃圾文件时顺手敲了一条rm -rf /tmp/test*,结果目录结构里其他几个无害的测试文件夹也一起没了。当时我连为什么都没想明白,后来对照RH124第三章重新过了一遍,才发现自己对通配符、路径解析和命令选项的理解全停留在“凑合能用”的层面。这一章表面是文件管理命令,实际是后面权限、文本处理、用户管理等内容的操作地基:没有路径概念,权限那章根本没法看;不懂文件类型,ln、find这些命令一出错就懵;不掌握通配符,批量处理日志文件只能老老实实一个个敲。而且RH124的问答题,或者说RHCSA方向的理论考点,恰恰最喜欢从这些“人人都觉得会”的小知识点里挖坑。所以这篇我按自己复习时踩过的坑和整理过的知识点来写,帮你把第三章从头到尾过一遍,顺便给出能直接照着做的实验步骤。
1. 先摸清RH124第三章的考试范围:文件管理命令的边界和实验沙盒搭建
1.1 这一章到底覆盖哪些知识点
RH124第三章的正式名字叫“从命令行管理文件”,注意它强调的是“从命令行”,不是让你用图形文件管理器。红帽的方向很明确:生产环境里,文件操作几乎都走命令行,尤其是远程服务器只有SSH的情况下,你不可能开GUI。所以这一章的知识点可以分成四块:文件系统层次结构、路径与目录操作、基本文件管理命令、通配符使用。很多人会把find、grep这种检索命令提前塞进来学,其实第三章还没到那一步,先把最基础的“增删改查”和路径体系吃透,后面学find、grep、vim时才不会手忙脚乱。
这里有一张我复习时整理的标准目录表,常见问答题会直接考“某个类型的文件应该放在哪个目录”:
| 目录 | 典型内容 | 记忆要点 |
|---|---|---|
| /etc | 系统配置文件 | 配置基本都在这 |
| /var | 日志、缓存、队列等可变数据 | 会不断变大 |
| /tmp | 临时文件 | 重启可能被清理 |
| /home | 普通用户家目录 | 每个用户对应一个子目录 |
| /root | root管理员家目录 | 只有root的家目录特殊 |
| /dev | 设备文件 | 硬盘、终端、null都在这里 |
| /bin、/sbin、/usr/bin、/usr/sbin | 命令程序 | 现代RHEL中/bin和/sbin通常是指向/usr/bin和/usr/sbin的软链接 |
| /boot | 内核和引导文件 | 不能随便乱动 |
问答题如果问“临时文件放哪、配置文件放哪、用户家目录在哪”,基本上就是围绕这张表出题。我的建议是不要死记硬背,而是多看看每个目录里实际装了什么,比如用ls /etc就会发现几乎所有服务的配置都集中在这一个地方,用ls /dev/sda*就能看到磁盘设备文件的命名规律,这样印象比背书深刻得多。
1.2 搭建一个安全的练习沙盒
学习文件管理命令最大的风险就是误删真实文件。所以我强烈建议你在/tmp下建一个专用练习沙盒,所有危险操作都限制在这个目录里。好处有两个:一是/tmp本身是临时目录,就算你把东西搞乱了,重启后系统也不会受到太大影响;二是你可以在里面大胆验证rm -rf、mv、ln这些命令的真实行为,而不必担心把家目录或系统目录搞坏。
我习惯用这样的命令初始化一个练习环境:
mkdir -p /tmp/rh124-lab/docs /tmp/rh124-lab/backup /tmp/rh124-lab/project cd /tmp/rh124-lab touch docs/readme.txt docs/report-2024.log docs/report-2025.log touch backup/notes.txt project/run.sh建好之后,你还可以用ls -li看一眼初始状态,那些数字就是inode编号,后面讲硬链接和符号链接时会反复用到。我把这个沙盒看成“实验台”,每次验证一个新命令之前,先想清楚“这个命令如果带通配符,到底会匹配到什么”,想不清楚就先echo一把预览,再执行真正的操作。这个习惯让我后续很少再翻车。
2. 路径这关过不好,后面操作全是坑:绝对路径、相对路径和cd/ls的实用细节
2.1 绝对路径与相对路径:分界线就一个斜杠
路径是文件管理的第一道门槛。绝对路径一定以/开头,比如/tmp/rh124-lab/docs/readme.txt,它不依赖你当前在哪个目录,任何时候都能唯一定位到一个文件。相对路径不以/开头,它基于当前工作目录来解释,比如你已经在/tmp/rh124-lab下,那么docs/readme.txt就能访问到同一个文件。
RH124问答题里有个经典变形:给你一个当前目录和一个相对路径,让你写出对应的绝对路径;或者反过来,给你绝对路径和当前目录,让你给出相对路径。这种题没有技巧,唯一的办法是动手画路径树。我自己复习时习惯用pwd先确认当前位置,再想清楚..表示上一级目录、.表示当前目录。写脚本或配置文件时,我会尽量用绝对路径,因为脚本的执行者可能不在你预期的目录下;但在交互式命令行里,相对路径更高效,因为敲的内容少,还方便配合Tab键补全。
这里补充三个被问烂但总有人答错的点。第一,cd -是回到上一个所在目录,不是回到家目录,cd不带参数才是回家目录。第二,路径中有空格时要用引号包住或用反斜杠转义,比如cd "/tmp/My Documents",不然bash会把一个路径拆成两段。第三,cd进目录要用Tab补全,但补全出来的内容如果带转义符,复制粘贴时别把转义符丢了。
2.2 ls命令不只是在“看”,它本身就是文件管理的基本盘
很多人觉得ls就是“看一眼列表”,但RH124里考察的其实是ls的各种选项组合。最基础的一定要背熟:ls -l显示详细信息,ls -a显示隐藏文件,ls -h以人类可读格式显示大小,ls -d显示目录本身而不是目录内容,ls -R递归显示子目录。把这些选项组合起来,就是问答题的素材。
举个例子,别人问你“怎么只列出当前目录下的子目录,而不列出文件”,答案是ls -d */。这个命令很多人第一次见会愣住,因为ls */会列出每个子目录里面的内容,加上-d才能只显示目录项本身。还有一个特别容易踩的坑:ls -l显示的目录大小是目录元数据的大小,不是里面所有文件的总大小,别再拿它去估算目录占用空间了。
我用一个表格把常用ls场景和对应命令总结了一下:
| 需求 | 命令 |
|---|---|
| 查看详细信息,包含权限、链接数、所有者、大小、时间 | ls -l |
| 查看全部文件,包含隐藏文件 | ls -a |
| 只查看目录本身的信息 | ls -ld 目录名 |
| 只看当前目录下的子目录 | ls -d */ |
| 递归查看目录树 | ls -R |
| 组合使用,比如详细且显示隐藏 | ls -la |
这些选项不是靠背,而是靠反复用。我在沙盒里练ls -ld docs和ls -l docs时才发现差别:前者显示的链接数是目录本身的链接数,后者显示的是目录里文件信息,这个细节后面讲目录硬链接时还要用上。
3. 文件类型判断:ls -l 输出里的第一个字符,比权限位隐藏更多信息
3.1 七种文件类型:从第一个字符读起
ls -l输出里,权限位的第一个字符很多人会忽略,其实它是文件类型标识。RH124问答题经常给出一段ls -l输出,让你判断这个文件是普通文件、目录、软链接还是设备文件,本质就是考这个字符的识别。
| 首字符 | 文件类型 | 现实例子 |
|---|---|---|
| - | 普通文件 | 文本文件、脚本、二进制程序 |
| d | 目录 | /tmp、/etc |
| l | 符号链接(软链接) | /bin指向/usr/bin |
| b | 块设备 | /dev/sda、/dev/nvme0n1 |
| c | 字符设备 | /dev/tty0、/dev/null |
| p | 命名管道 | 用mkfifo创建 |
| s | 网络套接字 | 部分服务生成的socket文件 |
想直观看到这些类型,你只需要在系统里跑几条命令:
ls -l /dev/sda /dev/tty0 /dev/null你会看到第一列分别以b和c开头。普通文件以-开头,目录以d开头,符号链接以l开头,这些是RH124最常考的三类。而命名管道和套接字在真实系统中也存在,只是普通用户平时碰得少。你可以在沙盒里用mkfifo /tmp/rh124-lab/myfifo创建一个命名管道,再ls -l看它,首字符就是p,这个实验做一次就忘不了。
3.2 文件类型在问答题里的常见变形
问答题不会傻乎乎地问“d代表什么”,它常会包装成下面这些形式。第一种:给一段ls -l输出,权限位写作lrwxrwxrwx,问你这是什么类型、权限为什么是777。答案是符号链接,但要注意,符号链接的权限列显示rwxrwxrwx并不代表目标文件真的有这个权限,真正决定访问权限的是目标文件本身的权限。这个问题我在实际排查权限问题时也遇到过,所以印象特别深。
第二种:问stat命令能告诉你什么。stat可以看到文件类型、权限、inode编号、大小、修改时间、访问时间、状态改变时间。这里有个理论考点:ctime不是创建时间,而是状态改变时间,任何权限改动、硬链接数变化、所有者变化都会刷新ctime,只有文件内容改变才刷新mtime。RH124很喜欢拿这三个时间做对比,我用一个表来区分:
| 时间 | 全称 | 什么时候变化 |
|---|---|---|
| atime | access time | 文件内容被读取时 |
| mtime | modify time | 文件内容被写入修改时 |
| ctime | change time | 文件权限、所有者、链接数等元数据变化时 |
第三种:问“符号链接和硬链接在ls -l里有什么区别”。符号链接显示l开头,硬链接如果和原文件在同一个目录里,看起来仍然是-开头的普通文件,唯一的线索是ls -li里inode相同,或者ls -l的第二列链接数大于1。这个细节放到最后一章一起展开。
4. 通配符批量操作的本质:shell先展开,命令后执行,以及问答题爱挖的三个陷阱
4.1 shell展开在先,命令执行在后:理解通配符的钥匙
通配符看起来简单,但理解它的核心在于明白一个执行流程:shell在真正执行命令之前,会先把包含通配符的参数展开成匹配到的文件列表,然后命令才拿到这些具体的文件名。比如你敲echo *.txt,实际执行的是echo a.txt b.txt c.txt,而不是把*.txt这个字符串传给echo。
三种基础通配符必须滚瓜烂熟:*匹配零个或多个字符,?匹配恰好一个字符,[abc]或[a-z]匹配方括号内任意一个字符,[!abc]取反。我常用一个例子演示它们的区别:
cd /tmp/rh124-lab/docs touch a.txt b.txt ab.txt file1.txt file2.log ls *.txt ls file?.txt ls file[12].txt ls file[!1].txt第一个*.txt会匹配所有以.txt结尾的文件;第二个file?.txt只会匹配file1.txt、file2.txt这样中间恰好有一个字符的文件,不会匹配file.txt;第三个file[12].txt等价于file1.txt file2.txt;第四个file[!1].txt匹配file2.txt,排除了file1.txt。如果你不确定某个通配符会匹配到什么,最简单的方法是先跑echo预览,不要直接执行删除或移动命令。
4.2 问答题高频陷阱:隐藏文件、[]取反和空匹配
RH124问答题在通配符上最爱挖三个坑。第一个坑是隐藏文件匹配。以点开头的文件在默认情况下不会被*、?、[]匹配到,也就是说ls *.conf不会显示.hidden.conf。想匹配隐藏文件,必须显式地写成ls .*或ls .*.conf,但.*自身还会匹配.和..两个特殊目录项,这又是一个连环坑。
第二个坑是[]里的范围写法。[a-z]匹配小写字母,但如果文件名里同时有大写和小写,范围会随locale影响,在比较严格的环境中可能导致“看起来应该匹配却没匹配上”。为了避免歧义,我建议把要匹配的字符范围写得窄一点,比如[0-9]表示数字,[A-Za-z]表示字母,而不是贪图方便写[a-Z]这种奇怪范围。
第三个坑是“通配符没有匹配到任何文件时会发生什么”。在bash默认行为下,未匹配的通配符会原样传给命令,比如当前目录没有任何.txt文件,你执行cat *.txt,bash会把*.txt当作一个字面文件名传给cat,然后报“No such file”。这个行为和很多人以为的“命令不执行”完全不同,问答题如果考到这里,标准答案就是“通配符保持原样,命令会尝试处理这个不存在的字面文件名”。实战中这个坑也很常见,尤其写脚本时,一条rm *.log在没有匹配文件的情况下可能就会报一个隐晦错误,所以脚本里提前用ls或find判断一下永远不亏。
5. cp、mv、rm的选项差异:从“够用”到“不出事”的实战习惯
5.1 cp:最容易把-r记错的场景
cp命令的基本用法是cp 源文件 目标,如果目标是目录,则把文件复制到该目录下;如果目标不存在,则创建一个同名文件。但很多人第一次复制目录时都会翻车,因为直接cp dir1 dir2会报“omitting directory”,必须加-r或-a才能递归复制整个目录。
-r和-a的区别也是考点。-r只是递归复制,-a相当于-d -p -R的合集,会保留符号链接、权限、所有者、时间戳这些属性,常用于做备份。问答题如果问“怎么完整保留文件属性复制目录”,答案就是cp -a。我实际用下来还有一个小建议:如果只复制目录里的普通文件,用cp *.txt ../backup/时不需要-r,因为通配符展开后的每个文件都是普通文件;只有当你复制的对象本身就是目录时才需要递归选项。想验证目标位置是否正确,先ls或echo预览,再批量复制,能避免很多莫名其妙的错误。
cp还有一个容易忽视的点:多文件复制时目标必须是目录,否则会报错。比如cp a.txt b.txt /tmp/rh124-lab/backup/,最后一个参数必须是目录;如果你写成了cp a.txt b.txt,cp会认为是把多个文件复制到同一个名为b.txt的文件,直接报错。这个在RH124实验里不算难题,但容易在紧张时犯低级错误。
5.2 mv:同一文件系统是改名,跨文件系统才是复制
mv命令表面上只是“移动”,但底层行为取决于源和目标是否在同一文件系统。同一文件系统内的mv其实是一个rename操作,开销很小,文件名瞬间变化,inode编号不变,权限、所有者、时间戳也全保留。跨文件系统移动时,mv会变成“先复制到目标区域,再删除源文件”,inode会变,耗时也会明显拉长。
问答题如果问“为什么移动一个大文件到另一个分区会变慢”,答案就是这个。实践里还有一个冷知识:mv移动目录时不需要加-r,因为目录作为一个整体被改名或移动,不像cp那样逐项复制。所以mv docs ../backup/完全合法,这也是mv和cp在用法上一个很大的差异。
另外一个我后来才注意到的点是,mv在覆盖已有文件时,如果目标文件存在且你有权限,它默认会直接覆盖,不会提示。很多发行版会帮你设置alias mv='mv -i',但这个别名只对交互式shell生效,在脚本里可不一定存在。所以关键文件移动之前,最好先确认目标目录里有没有同名文件。
5.3 rm的自我保护:别名、确认与目录练习
rm是文件管理命令里最危险的一个,RH124虽然不会让你在考试里去删系统文件,但问答题肯定会围绕“如何安全删除”出题。基础选项不用多说:rm删普通文件,rm -r递归删除目录及内容,rm -f强制删除不提示,rm -i逐个确认,rm -v显示删除过程。
真正值得警惕的是rm -f和rm -i的冲突。很多Linux发行版在交互式shell里默认设置了alias rm='rm -i',所以你在终端里敲rm会看到确认提示;但在脚本或某些非交互环境下,别名不生效,rm会直接删除。这会导致实验环境里“明明刚才有确认,现在怎么没了”的错觉。我复习时给自己定的规矩是:删除前先ls -l确认目标,再用rm -i或rm -v练习,必须用rm -rf时,先在命令前加一个echo模拟展开结果,确认匹配范围无误后再真正执行。
rmdir命令只删除空目录,RH124会把它和rm -r区分开考。如果你只想删一个空目录,rmdir更安全;如果目录里有文件,rmdir会报错,这时再用rm -r。顺便提一句,避免在/或/home下随手敲rm -rf带星号的组合,除非你在沙盒里明确知道自己在做什么。把危险命令限制在练习目录里,这是所有文件管理操作的第一原则。
6. 硬链接和符号链接:RH124理论题的雷区与实验自检方法
6.1 硬链接的底层逻辑:多个名字指向同一个inode
硬链接是RH124问答题里最容易混淆概念的部分。要理解硬链接,必须先理解inode:Linux文件系统里,每个文件都有独立的inode,里面保存权限、所有者、大小、时间戳和数据块位置,而文件名只是目录里的一条记录,指向这个inode。硬链接的本质,就是在一个新目录里创建一个新的目录项,让另一个名字也指向同一个inode。
创建硬链接的命令是ln 原文件 新文件。创建后,你用ls -li能看到两个文件的inode编号完全一样,ls -l第二列的硬链接数变成2。硬链接有两个硬限制:不能跨文件系统,因为不同文件系统的inode编号没有可比性;不能指向目录,因为那会造成环路。问答题如果问“为什么硬链接不能跨分区”,答案就是inode属于特定文件系统,跨分区就失去了“同一文件”的意义。
实际验证硬链接最直观的方法是删掉原文件再访问链接文件:
cd /tmp/rh124-lab echo "link test" > source.txt ln source.txt hard.txt ls -li source.txt hard.txt rm source.txt cat hard.txt你会发现hard.txt照样能读出内容。这是因为删除原文件时,系统只是删掉了一个目录项,inode的硬链接数从2变成1,只要还有目录项指向它,文件数据就不会被真正释放。这个行为是RH124特别喜欢考的知识点,不要把它和符号链接弄混。
6.2 符号链接:可以断、可以跨文件系统、可以指向目录
符号链接,也就是软链接,是一个独立的特殊文件,它里面保存的是“目标文件的路径字符串”。创建方式是ln -s 目标 链接名。ls -l查看时会显示类似lrwxrwxrwx 1 user user 14 /tmp/rh124-lab/soft.txt -> source.txt的内容,那个箭头后面的路径就是链接文件里保存的字符串。
软链接和硬链接最大的区别,在于软链接可以跨文件系统、可以指向目录、可以指向不存在的目标(虽然会成为断链)。它更像是一个“指向路径的指针”,如果目标被移动或删除,软链接不会跟着变化,就会变成broken symbolic link。验证断链很容易:
ln -s source.txt soft.txt rm source.txt cat soft.txt此时cat会报“No such file or directory”,而硬链接不会。软链接的权限列看起来是rwxrwxrwx,但真正生效的权限是目标文件的权限,这也是问答题的经典陷阱。
创建符号链接时还要注意一个非常坑的细节:相对目标路径的基准不是当前shell目录,而是链接文件自身所在的目录。什么意思呢?假设你在/tmp/rh124-lab/docs目录下,想创建一个指向/tmp/rh124-lab/source.txt的软链接,如果你写ln -s ../source.txt docs/soft.txt,那么soft.txt里的内容就是../source.txt,这个相对路径会从docs/目录向上解析,最终指向/tmp/rh124-lab/source.txt,没问题。但如果你写成ln -s source.txt docs/soft.txt,那么软链接里的路径就是source.txt,从docs/目录解析时它会去找/tmp/rh124-lab/docs/source.txt,结果就是断链。刚学软链接时,我在这里反复栽跟头,后来才养成习惯:要么用绝对路径创建软链接,要么先cd到链接要放的位置,再指定相对路径。
6.3 链接实验自检清单:RH124实操前最好先跑一遍
学完硬链接和软链接,我建议你用下面这份清单在沙盒里做一次完整自检,既能验证理解,也能当考前复盘:
第一,创建origin.txt,分别创建hard.txt和soft.txt两个链接,用ls -li确认origin和hard的inode相同,而soft是独立inode。第二,删除origin.txt,观察cat hard.txt和cat soft.txt的差别,硬链接正常、软链接断链。第三,尝试ln origin.txt /tmp/rh124-lab/backup/hard.txt,如果两个目录在同一个文件系统里会成功,如果跨分区会报错,这个实验能帮你理解“硬链接不能跨文件系统”。第四,用readlink soft.txt查看软链接内容,确认它是绝对路径还是相对路径,然后故意把一个相对路径软链接移动位置,看看会不会断。
还有一个理论题常考的点是目录的硬链接数。一个空目录的硬链接数是2,因为目录项本身和里面的..都指向它;每增加一个子目录,硬链接数就加1。所以用ls -ld查看目录链接数时,如果看到5,通常意味着这个目录下有3个子目录。这个规律理解一次就够,没必要背。
把链接实验完整跑一遍,再回到ls -l看那些l开头和链接数大于1的文件,你基本就掌握了RH124第三章的精华。我在实际运维中排查文件丢失、备份失效、脚本找不到路径的问题时,依赖的也是这套对路径和链接的理解。