1. Linux文件系统与路径概念入门
1.1 为什么路径是Linux操作的第一道门槛
很多刚接触Linux的朋友,最容易栽跟头的不是命令记不住,而是搞不清"我现在在哪""我要去的文件在哪""怎么描述这个位置"。Windows时代大家习惯双击图标进文件夹,目录层级靠脑子记,路径这个概念几乎不用刻意学。但Linux不一样,你会发现几乎所有操作都绕不开路径这回事,装软件要写路径、改配置要写路径、写脚本要写路径、连排查问题看日志也得先把路径找准了才行。
我当年带新人时最爱问一个问题:"/etc/nginx/nginx.conf"这个路径,从根目录开始数,一共经过了几层目录?别看这问题简单,真能一步答对的没几个。不是因为难,而是大多数人从来没有主动去理解路径的组成结构,全靠粘贴复制。等你哪天真要在一台没有图形界面的服务器上部署服务,或者写一个自动化脚本要在不同目录之间切换、读写文件,路径理解不到位,写出来的东西就是各种"file not found"。
理解路径本质上是在理解Linux整个文件系统的组织方式。Linux采用树状的目录结构,最顶端是一个叫根目录的"/",下面挂着/etc、/var、/usr、/home这些标准目录,每个目录又可以继续往下挂子目录和文件。你需要掌握的第一件事,就是"从哪个位置出发去描述一个文件的位置",这直接决定你用的是绝对路径还是相对路径。
1.2 绝对路径与相对路径的实战对比
绝对路径很容易理解,就是"从根目录/开始,一路写到目标文件"的完整路径,比如/home/user/docs/report.txt。不管你现在人在哪个目录,只要写全这条路径,系统就能准确定位到文件。相对路径则是"以当前所在目录为起点"来描述目标位置,比如当前在/home/user下,要去docs目录里的report.txt,直接写docs/report.txt就行。
这两者的使用场景差别很大。在命令行里临时操作,比如你本来就在/home/user下闲逛,那用相对路径肯定更快,敲起来字符少。但在脚本和配置文件里,强烈建议写绝对路径。原因很实在:脚本的执行位置不受你控制,可能被cron定时任务调用、可能被systemd服务启动、可能被别的程序用绝对路径调起来,一旦脚本里用了相对路径,它依赖的就是"执行那一刻的工作目录",这个是不可控的,分分钟给你来个file not found。
还有一个容易忽略的点:路径里的点和点点。一个点"."代表当前目录,两个点".."代表上一级目录。比如你在/home/user/docs目录下,想回到/home/user,敲cd ..就行。想在命令里引用当前目录下的文件,./install.sh这种写法就是在明说"执行当前目录下的install.sh",避免系统去PATH环境变量里瞎找。别小看这点和点点,脚本里大量使用相对路径做文件定位时,多写一个点和少写一个点,结果天差地别。
提示:写脚本和配置文件里的路径建议统一使用绝对路径,牺牲一点输入便利换取稳定可控。命令行临时操作则优先用相对路径,效率高。两套思路是针对不同场景的,不要搞反。
1.3 路径相关的隐藏规则与常见陷阱
Linux路径里有一个特别容易坑新手的点:文件名大小写敏感。Report.txt和report.txt是两个完全不同的文件,这在Windows用户眼里简直反人类。另外,Linux文件名里可以有空格、可以有特殊字符,这给脚本处理带来不少麻烦。比如一个文件叫my report.txt,直接输cat my report.txt,系统会认为你传了两个参数my和report.txt。这种时候要么用引号包起来(cat "my report.txt"),要么用反斜杠转义空格(cat my\ report.txt)。
另一个典型问题是隐藏文件。Linux里以点开头的文件是隐藏文件,ls命令默认看不见,要加-a参数才显示。新手常常疑惑"我明明创建了配置文件,怎么ls看不到",十有八九是文件名以点开头。这类文件在用户目录下特别多,比如.bashrc、.profile这些,都是藏着的重要配置文件。
还有一个路径解析上的细节:路径末尾要不要带斜杠。ls /home/user/ 和 ls /home/user在绝大多数情况下结果一样,但如果你用软链接(符号链接)指向目录,就会发现末尾斜杠的行为差异能直接影响命令结果。cp命令里源路径末尾带不带斜杠更是天壤之别,后面讲文件操作时我会着重强调。
2. 日常高频Linux基本命令实操
2.1 目录操作三兄弟:pwd、cd、ls
这三条命令是Linux命令行里最基础的,可以这么说,你只要打开终端,就一定会用到它们。
pwd用来显示当前所在目录的完整路径。功能简单,但实际排查问题时特别有用。脚本执行报错找不到文件,第一件事就是跑一下pwd,看看当前工作目录到底在哪,很多问题瞬间就明白了。它是"定位自己"的命令。
cd用来切换目录。cd /etc切换到etc目录,cd ..回到上一级,cd ~直接回到当前用户的家目录,cd -切回上一次所在的目录(这个用法很多人不知道,在两个目录之间来回切换时非常好用,比我之前傻傻地重复输完整路径快得多)。注意cd命令只有登录用户的HOME目录有~这个快捷写法,root用户返回的是/root。
ls用来列出目录内容,但它远比想象中强大。基础用法是ls直接列出当前目录内容,ls -l以详细列表形式展示文件权限、属主、大小、修改时间,ls -a显示包括隐藏文件在内的所有文件,ls -h配合-l使用能显示人类易读的文件大小(比如1K、234M),ls -t按修改时间排序,ls -R递归列出子目录内容。实战中我几乎固定使用ls -lh的组合,信息完整又直观。还有一个ls -d */的技巧,只列出当前目录下的子目录,不带出文件,清理目录结构时很好使。
2.2 文件管理命令:touch、cp、mv、rm的安全打开方式
文件操作是Linux日常管理中使用频率最高的一类命令,但也是"事故高发区",尤其是rm命令,一个不小心就能把重要数据删得干干净净,连后悔药都没得吃。
touch命令主要有两个用途:创建空文件和更新文件时间戳。想快速新建一个空文件用来测试,touch test.txt就完事了。如果文件已存在,touch会把它最后修改时间更新为当前时间,这个特性偶尔用来触发某些依赖文件时间戳的构建任务。
cp命令复制文件或目录。cp file1.txt /home/user/backup/把文件复制到目标目录,cp -r dir1 /tmp/dir2递归复制整个目录(不加-r复制目录会直接报错),cp -p连同文件属性一起复制(常用于备份时保留原始权限和时间戳)。这里必须重点强调一个坑:cp复制软链接时,默认行为是复制软链接指向的目标文件内容,而不是复制链接本身。想复制软链接,要加-d或-a参数。好多人在备份配置目录时没注意这点,结果所有软链接全变成了实体文件,恢复回去以后一堆程序报错。
mv命令用来移动文件或重命名。mv old.txt new.txt就是重命名,mv file.txt /tmp/就是移动。mv也有一个容易翻车的点:跨文件系统移动时,mv底层其实是先复制再删除,如果中途断掉或者空间不足,可能源文件还在,目标只复制了一半。所以跨设备移动重要数据,我习惯用cp确认完整后再rm源文件,慢是慢点,但稳。
rm命令删除文件或目录。rm file.txt删除文件,rm -i会逐个问你是否确认(强烈建议养成加-i的习惯,尤其root用户),rm -r递归删除目录及其内容,rm -f强制删除不提示。这三个参数组合出来的rm -rf是个危险系数极高的命令,网上各种段子都在说别乱用。讲句实在话,rm -rf本身没错,错的是用错地方。比如rm -rf /home/user/和rm -rf /home/user/的区别(末尾多一个斜杠),在某些老版本命令解析下可能导致完全不同的后果。我的经验是:删除前先ls看清楚,再执行rm操作;重要的删除操作临时加个-i参数让系统跟你确认一遍,不丢人。
2.3 查看文件内容的四把刷子
Linux下查看文件内容有cat、more、less、head、tail几个高频工具,各有各的适用场景。
cat是最直白的,一次性把整个文件内容全部输出到屏幕。适合看短文件、代码文件,或者把几个文件拼接起来(cat a.txt b.txt > c.txt)。缺点也很明显:文件一大,内容刷屏刷到根本看不过来,而且只显示最后几十行的存在感几乎为零。
more是最早期的分页查看工具,一屏一屏地显示,空格翻页、q退出。功能太简单,不能往上翻,现在已经用得少了。
less是more的增强版,也是我在生产环境最常用的查看工具。它支持上下翻页、支持搜索(/关键词往下搜,?关键词往上搜)、支持跳转到指定行(输入行号然后G)、支持各种方向键操作,功能非常强大。有人戏称less是"Linux下最好用的打开方式",因为这个工具不仅能用于查看文件,还能配合管道处理其他命令的输出,比如dmesg | less这样。
head和tail则用来查看文件的开头部分和结尾部分。head -n 20 file.txt查看前20行,tail -n 50 file.txt查看最后50行。tail有个特别关键的功能是-f模式:tail -f file.txt会持续追踪文件新增的内容并实时显示,排查日志时的神器,程序崩了看日志,日志更新tail -f实时跟着看,定位问题速度能快一倍。如果日志一直不动,最后可能还要用上tail -F(注意大写),这个参数能处理日志文件被轮转(重命名或重建)的情况,即使文件被logrotate切走了也能继续追踪新文件。
3. 文件编辑:从vi/vim到sed实战
3.1 进入vi/vim之前必须搞懂的三种模式
服务器上最常见的文本编辑器就是vi/vim,Debian系新装系统里通常带的是vim-tiny或vim minimal版本,但核心操作逻辑不变。新手最容易卡死的点:不知道vim有模式之分,进了vim以后乱按一通,发现屏幕下方冒出"recording"之类的字样,然后慌了。
vim有三种基本模式:命令模式(Normal mode)、插入模式(Insert mode)、底行模式(Command-line mode)。
刚打开vim文件时默认处于命令模式,在这个模式下,键盘上几乎所有按键都是命令而不是输入文字。比如按j向下移动光标、按k向上移动、按x删除光标所在字符、按dd删除整行、按yy复制整行。要在文件里输入内容,先按i进入插入模式,此时才能像正常文本编辑器那样打字。编辑完按Esc回到命令模式,然后输入:wq保存退出,或者:q!不保存强制退出。这是一整套流程,任何一步卡住都会让人以为vim坏了。
初学者最应该记住的三件事:进入插入模式按i,回到命令模式按Esc,在命令模式下输入:是底行模式(可以保存退出、搜索替换)。这三条记住了,vim日常使用的基础就撑起来了。
3.2 编辑、搜索与替换的高频操作
vim里的高频操作我整理成几组来记,效率提高很多。
屏幕滚动相关:Ctrl+f向下翻页、Ctrl+b向上翻页、gg跳到文件首行、G跳到文件尾行、:set nu显示行号(临时性的,退出vim就没了,想永久显示就写入~/.vimrc)。光标移动:0跳到行首、$跳到行尾、w按单词跳跃、b往回跳单词。
删除、复制、粘贴:x删一个字符,dd删一行(配合数字可以用3dd一次性删除3行),yy复制一行(3yy复制3行),p在当前光标位置下方粘贴。这些操作按熟了,编辑效率绝对甩鼠标几条街。
搜索:在命令模式下按/,输入关键词回车即可从当前位置向下搜索,按n跳到下一个匹配项,N跳到上一个。搜索时vim还会高亮所有匹配项,看着很舒服。
替换:最常用的是:s。基础格式是:s/old/new/把当前行第一个匹配的old替换成new,全局替换整个文件的格式是:%s/old/new/g,其中%表示所有行,g表示一行内所有匹配都要替换,不加g只替换行内第一个。想要每次替换前都确认一下,可以加c参数::%s/old/new/gc,它会逐个询问是替换还是跳过。文件比较大、替换内容比较关键时,我强烈建议加c参数,手快改错再回滚可比多按几个y麻烦多了。
底行模式还经常用来做批量操作。比如:1,100d删除第1到100行,:5,10s/v1/v2/g把第5到10行的v1全部替换成v2。这些按范围操作的语法在sed里也有对应版本,搞懂一套另一套就能很快迁移。
注意:vim编辑系统关键配置文件之前,建议先复制一份备份。配置文件修改完成后,强烈建议先验证配置格式是否正确再重启服务。比如改完nginx配置文件,先nginx -t检查语法,确认通过再重启nginx,能避免把线上服务搞崩。
3.3 命令好帮手:sed批量处理文件内容
sed是一种流编辑器,和vim的交互式编辑不同,sed适合对文件内容做批量的、非交互式的处理。什么场景用sed?比如你要在服务器上一百个配置文件里统一把IP地址从192.168.1.10改成192.168.1.11,用vim一个个改会疯掉,用sed一行命令就搞定。
看几个最实用的例子:
sed -i 's/old/new/g' file.txt 直接把文件里所有old替换成new,-i表示直接修改原文件。不加-i只是把替换结果输出到屏幕,原文件不变。
sed -n '20,30p' file.txt 只打印第20到30行内容。-n配合p表示只输出指定范围的内容,避免整个文件都被打印出来。
sed -i '/pattern/d' file.txt 把包含pattern的行全部删掉。这个在日志清理、配置文件瘦身时很有用。
sed -i '3,5d' file.txt 删除第3到5行。
sed -i '10i\insert this line' file.txt 在第10行之前插入一行内容。
sed命令的学习曲线比vim平缓很多,关键是理解sed的处理模型:它逐行读取文件,对每一行应用你给它的命令,然后输出。理解了这一点,很多看起来复杂的sed命令都能看懂了。日常运维里最常用的就是s替换和d删除,再配合-i直接落盘,剩下的等遇到了再查也不迟。
4. 常见问题排查与避坑实录
4.1 "Permission denied"和"No such file or directory"排障
这两个报错大概占据了我日常帮人排查问题的一半以上,而且很多场景下问题不在表面。
Permission denied,权限不足。先用ls -l查看文件的权限位,确认当前用户对文件是否有读、写、执行权限。比如-rw-r--r--这个输出表示文件属主有读写权限,属组只有读权限,其他人只有读权限,你如果不在属主或属组里,就只能读不能写。解决方案要么用sudo提升权限(前提是你有sudo权限),要么用chmod/chown调整文件权限和属主。这里要补充一个细节:Linux下对文件有写权限不代表能删除文件,删除文件取决于对文件所在目录是否有写权限。所以我经常看到有人问"我有文件的写权限,为什么rm删不掉",原因就是缺少目录的写权限。
No such file or directory,文件不存在或路径错误。除了真的文件不存在,还有两种情况很隐蔽:一种是路径里的目录名打错了,大小写不对,这在中英文切换输入法时特别容易犯;另一种是命令里的可执行文件不存在但你以为存在,比如./start.sh提示No such file or directory,实际上start.sh确实存在,但它内部指定的解释器路径不对(比如脚本第一行的#!/bin/bash写成了#!/bin/bashs),这种报错是最迷惑人的,解法是检查脚本头部的解释器路径和依赖的库文件是否存在。
4.2 中文乱码、软链接断裂、命令找不到
中文乱码:文件内容本身是UTF-8编码,但终端用locale设置的编码不匹配,导致显示乱码。排查思路是运行locale查看当前语言环境,如果LANG不是zh_CN.UTF-8或en_US.UTF-8这类UTF-8变体,就可能乱码。临时解决办法是export LANG=en_US.UTF-8重新设置。永久方案是修改/etc/locale.conf或者用户自己的.bashrc里加一行export LANG=en_US.UTF-8。还有一种情况是文件本身不是UTF-8编码(比如Windows拷过来的GBK文件),这种得用iconv转码工具处理。
软链接断裂:ln -s创建软链接后,原目标被移动或删除了,链接就成了"死链"。ls -l看出来的表现是目标部分显示红色或者标注了broken。处理方式很简单,删掉软链接重建,或者在移动目标时注意别把它原来的位置搞没。我刚才提到cp -d参数复制软链接本身而不是目标内容,也属于这个范畴。
command not found:敲命令提示找不到。排查顺序是:先确认命令是否安装(比如dig在部分系统里需要单独装dnsutils包),再确认命令路径是否在PATH环境变量里,最后检查命令名是否打错。有时候刚装完软件发现命令用不了,大概率是安装目录没有加入PATH,找到可执行文件所在目录,加到~/.bashrc的PATH里即可永久生效。
4.3 高频命令速查表与学习路线建议
这里把我日常真正高频使用的命令按功能整理成一个速查表,刚上路的同学可以把它存下来当手边手册用。表格里的命令不算全,但覆盖了绝大多数日常场景:
| 功能分类 | 常用命令 | 典型用法与说明 |
|---|---|---|
| 目录与文件定位 | pwd、cd、ls | pwd确认当前位置;cd切换目录;ls -lh查看目录内容 |
| 文件查看 | cat、less、head、tail | cat看小文件;less看大文件可搜索;tail -f追踪日志 |
| 文件操作 | touch、cp、mv、rm | 新建空文件、复制(-r递归)、移动/重命名、删除(-rf慎用) |
| 权限管理 | chmod、chown | chmod修改权限(如chmod +x file.sh);chown修改属主 |
| 文本处理 | grep、sed、awk | grep搜索文本;sed批量替换;awk按列处理 |
| 搜索 | find、which | find按条件找文件(如find /etc -name "*.conf");which定位命令位置 |
| 系统管理 | ps、top、df、du | ps查看进程;top监控资源;df查看磁盘空间;du查看目录大小 |
| 压缩打包 | tar、zip | tar -czvf打包压缩;tar -xzvf解压 |
| 网络工具 | ping、curl、ss、netstat | ping连通性;curl访问接口;ss/netstat查看端口监听 |
| 帮助文档 | man、--help | man ls查看ls的完整手册;ls --help快速看用法 |
按这个顺序学,先掌握目录文件相关命令,再学文本处理三剑客,然后了解系统管理,一个阶段一个阶段来,每个阶段配合实际场景练一练(比如用vim改一个配置文件,用sed批量替换,用tail追踪一个服务的日志),基本两周到一个月就能建立起动手能力。
学习路径上我再多说两句:光看命令手册是记不住命令的,最快的学习方式是带着任务去用。给自己定几个小目标,比如"给这台服务器装一个nginx并修改默认页面""排查一个服务为什么起不来""把某目录下所有日志里的IP统计出来",做完这几个任务,Linux基本命令的功力绝对会有质的提升。面试题里常问的Linux基础(比如软链接硬链接的区别、绝对路径相对路径的区别、grep/sed/awk的高频用法),其实都是在这些实操基础上延伸出来的,基础打牢了,面试题自然能答上来。
最后分享几个我踩过多次后养成的习惯:命令敲回车前先看一眼路径对不对;sudo执行高危命令前多确认一次;删除操作养成先ls再rm的习惯;重要的配置文件改之前备份一份带时间戳的副本。这些习惯看着简单,真到关键时刻能帮你省下大量救火时间。Linux这东西,日久见功力,多折腾、多踩坑、多复盘,慢慢就开出感觉了。