1. 写在前面:为什么你的Linux命令水平总卡在“会用但不够稳”
这两天在社群里又看到有朋友问“Linux基础指令到底要学哪些”,这个话题几乎每隔一段时间就会冒出来一次。很多人把ls、cd、cat背得滚瓜烂熟,可真到了实际干活的时候——要批量改配置文件、要给服务器新建一个用户、要查清楚是哪个进程占着端口——就开始手忙脚乱,要么到处翻笔记,要么干脆靠百度。这份“基础指令”系列我已经写到第4篇了,前几篇把文件操作、目录跳转、文本查看这些日常高频命令梳理了一遍,这篇打算换个思路:不再简单地罗列命令,而是围绕几个真实的操作场景,把那些“你觉得自己会、但一用就出事”的命令讲透。
这篇内容的定位是给已经掌握了最基础命令(ls、cd、cat、mkdir这些)的读者,帮你把命令从“认识”提升到“熟练工”的水平。全文会围绕四个典型场景展开:文件操作的安全细节、文本批处理的实用技巧、用户权限的日常管理、系统排查的基本功。这些场景几乎覆盖了日常运维和开发中用得最多的操作,学完可以直接用到自己的服务器上。
我会把每个场景里最容易踩的坑、最容易忽略的细节、以及我实际工作中总结出来的经验一起放进去。文章的风格会比较口语化,毕竟命令这东西,光看不练假把式,重要的是理解每条命令背后的逻辑,然后上手去敲。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 文件操作的安全区:rm、cp、mv 这些命令的隐藏细节
2.1 rm 命令:你真的会安全删除吗
要说Linux命令里最容易出事故的,rm绝对排得上前三。很多人知道rm -rf很危险,但到底危险在哪、怎么避免,却说不清楚。
rm的全称是remove,作用是删除文件或目录。基本用法没什么好说的,rm file删除文件,rm -r dir递归删除目录,rm -f file强制删除(不提示确认)。问题就出在这个组合拳上:
code复制rm -rf /
这是一个在各类段子里反复出现的经典命令。-r代表递归,-f代表强制,合在一起就是“不要问我,直接全删”。如果后面跟的是/(根目录),那就意味着把整个系统文件全部删除,而且过程没有任何提示。我亲眼见过有人在自己电脑上敲出这条命令,还没反应过来,系统就废了。
实际工作中,我建议给rm加个保护壳。最直接的办法是在~/.bashrc或~/.zshrc里加一行别名:
bash复制alias rm='rm -i'
这样每次删除文件前系统都会问一句“是否确认删除”,虽然多了一步操作,但能拦住绝大多数手误。如果你觉得每次都确认太烦,还有一个折中方案:
bash复制alias rm='rm -I'
注意是大写的I,这个参数的意思是在删除超过3个文件或者递归删除时才进行确认,单独删一两个文件不会打扰你。这个方案我用了很久,既保证了安全又不影响效率。
还有一个更彻底的做法——用trash-cli把删除变成“移到回收站”:
bash复制# Debian/Ubuntu系
sudo apt install trash-cli
# CentOS/RHEL系
sudo yum install trash-cli
trash-put file # 把文件丢进回收站
trash-list # 查看回收站
trash-restore # 恢复文件
trash-empty # 清空回收站
这套工具跟Windows的回收站逻辑一样,误删了还能捞回来。对于生产环境的服务器,我个人强烈建议装上这个,至少心里有个底。
2.2 cp 和 mv:看起来简单,其实藏着不少讲究
cp(copy)和mv(move)是另外两个高频命令。cp a.txt b.txt是把a复制一份命名为b,mv a.txt b.txt是把a改名或移动到b。表面看都很简单,但有几个参数是日常使用中经常要用的。
先看cp的几个关键参数:
cp -r dir1 dir2:递归复制目录,不加-r复制目录会报错cp -p file1 file2:保留文件的权限、属主、时间戳等属性cp -a dir1 dir2:相当于-r加-p,常用于备份
-a这个参数特别适合做备份场景。比如你有一个网站目录/var/www/html,想复制到/backup/html_backup,用cp -a能把所有文件属性原样保留,恢复的时候不会出现权限错乱。
mv有个容易忽略的点:跨文件系统移动时,mv实际执行的是“复制加删除”而不是单纯的“改变路径指向”。这意味着如果目标磁盘空间不足,移动可能会失败,而且源文件可能处于中间状态。遇到这种情况,稳妥的做法是先cp确认无误后再删源文件。
另外有个小技巧:cp命令默认遇到同名文件会直接覆盖,不会问你是否确认。避免覆盖的方法同样是通过别名:
bash复制alias cp='cp -i'
alias mv='mv -i'
如果你不想改全局配置,也可以用cp -n,这个参数表示“如果目标文件已存在则不覆盖”,适合在脚本里使用。
还有一个经常被问到的问题:怎么复制文件但排除某些子目录?cp本身没有直接的排除参数,但可以配合rsync来实现:
bash复制rsync -av --exclude='node_modules' /source/ /target/
rsync会在后面的文章里单独讲,这里先做个预告。如果只是想临时排除少量文件,也可以用tar配合管道的方式,不过相对繁琐。
2.3 通配符和引号:文件匹配的几个坑
在文件操作中,通配符的误用也是隐藏的定时炸弹。星号*代表任意长度字符,问号?代表单个字符,方括号[abc]代表中括号内的任意一个字符。比如:
bash复制rm *.txt
这条命令的意思是删除当前目录下所有以.txt结尾的文件。看起来很明确,但有个坑:如果当前目录同时有a.txt和a.txt.bak,*.txt只会匹配a.txt,a.txt.bak不会被匹配到。因为*虽然能匹配任意字符,但最后的.txt是固定后缀。
还有一个更隐蔽的问题:当通配符没有匹配到任何文件时,大多数shell会把原样的通配符字符串传给命令。什么意思呢?比如你在一个空目录里执行:
bash复制rm *.log
如果目录下根本没有.log文件,shell会把*.log这个字符串原封不动地传给rm,于是你会看到一条“无法删除'*.log':没有那个文件或目录”的报错。虽然不会造成破坏,但会让人困惑一阵子。
这里我强烈建议:使用rm配合通配符之前,先执行ls看看通配符到底匹配了哪些文件。你也可以把rm和ls写在一起,用分号隔开:
bash复制ls *.log; rm *.log
先看后删,虽然多敲几个字符,但能避免绝大多数误删事故。
引号也是一个容易出问题的地方。在shell里,双引号内的$、反引号等仍会被解析,单引号则完全不做任何解析。举一个实际例子:
bash复制echo "$HOME" # 输出 /root 或 /home/username
echo '$HOME' # 输出 $HOME
在处理包含特殊字符的文件名时,比如带空格的文件my file.txt,建议始终用引号把文件名包起来:
bash复制rm "my file.txt"
如果你不包引号,rm my file.txt会被解析成删除my和file.txt两个文件,很容易出问题。
3. 文本处理实战:sed 和 more 这样用才顺手
3.1 sed:一个能批量替换、精准定位的文本编辑利器
说到Linux下的文本处理,sed(Stream Editor,流编辑器)是绕不开的工具。它最擅长的场景是“在不打开编辑器的情况下,对文本文件进行批量的替换、删除、插入等操作”。
sed的基本语法是:
bash复制sed '操作范围+操作命令' 文件名
最常见的操作是替换:
bash复制sed 's/old/new/' file.txt
这条命令把file.txt每一行中第一个出现的old替换成new。注意,它默认只替换每行第一个匹配的字符串,如果想要替换全部,要在末尾加g:
bash复制sed 's/old/new/g' file.txt
g代表global,意思是全局替换。这个参数非常容易漏,我刚开始用sed的时候经常替换完发现只改了一半,后来养成了习惯,凡是替换操作一律加g。
另一个高频操作是指定行号。比如只想替换第3行的内容:
bash复制sed '3s/old/new/g' file.txt
或者替换第2行到第5行:
bash复制sed '2,5s/old/new/g' file.txt
sed默认把处理结果输出到屏幕,并不会修改原文件。这是一个非常重要的特性:它是“流”处理,源文件保持不变。如果你确认修改没问题,想直接写回原文件,需要加-i参数:
bash复制sed -i 's/old/new/g' file.txt
这里我必须提醒一句:-i会直接修改原文件,而且没有撤销功能。建议第一次用的时候先不加-i,把输出结果检查一遍,确认没问题再带上-i执行。或者用-i.bak,它会自动生成一个.bak备份文件:
bash复制sed -i.bak 's/old/new/g' file.txt
这样如果改错了,还能用备份文件恢复。
除了替换,sed还可以删除行。比如删除文件中的第3行:
bash复制sed '3d' file.txt
删除第2行到第5行:
bash复制sed '2,5d' file.txt
删除所有包含某个关键字的行:
bash复制sed '/关键字/d' file.txt
sed配合正则表达式能实现非常复杂的文本处理。比如把文件中所有以#开头的注释行删掉:
bash复制sed '/^#/d' file.conf
这里的^是正则表达式中“行首”的意思。再比如把多个连续空格压缩成一个:
bash复制sed 's/ */ /g' file.txt
实际工作中,sed最常见的用武之地是批量修改配置文件。比如我有一次在服务器上部署新环境,需要把所有配置文件里的旧域名old.example.com全部替换成新域名new.example.com,一个个用vi改要改几十个文件。用sed加上find一条命令就搞定了:
bash复制find /etc -type f -name "*.conf" -exec sed -i 's/old\.example\.com/new\.example\.com/g' {} \;
这个命令先用find找到所有.conf结尾的配置文件,然后逐个执行sed替换。注意正则里的点号\.需要转义,因为点号在正则里代表任意字符,不转义的话会把oldXexampleXcom也替换掉,虽然大多数情况下不会有这种巧合,但严谨起见还是应该转义。
3.2 more、less、head、tail:查看文件的不同姿势
more命令出现在热词里了,这里一并说一说。more是用来分页查看文件内容的,适合看大文件,因为它不会一次性把整个文件载入内存,而是按页加载。基本用法:
bash复制more /var/log/syslog
打开后按空格键翻下一页,按b翻上一页,按q退出。more的缺点是只能往下翻,不能往回翻(某些实现支持但不通用)。所以现在更多人用的是less,less是more的增强版,支持上下翻页、搜索关键字等操作。
bash复制less /var/log/syslog
在less界面里,按/可以搜索关键字,按n跳到下一个匹配,按q退出。它的灵活性远高于more,我个人已经很少用more了,但偶尔在脚本里还是会用到,因为more在某些系统上是默认安装的,less不一定。
查看文件还有一个常用组合是head和tail:
bash复制head -n 20 file.txt # 查看文件前20行
tail -n 20 file.txt # 查看文件最后20行
tail -f /var/log/nginx/access.log # 实时跟踪文件新增内容
tail -f这个参数是“follow”的缩写,意思是跟随文件增长。调试日志的时候,挂着tail -f看实时输出是非常高效的工作方式。如果日志刷得太快,可以配合grep过滤一下:
bash复制tail -f /var/log/nginx/error.log | grep "ERROR"
这样屏幕上只会显示包含ERROR的行,其他日志都过滤掉了。等调试完,按Ctrl+C退出。
3.3 管道和重定向:串起命令的“胶水”
上面例子中的|字符就是管道,它的作用是把前一个命令的输出作为后一个命令的输入。这是Linux命令行的灵魂之一,也是从“单个命令使用者”进阶到“命令组合玩家”的关键。
举几个常用的管道用法:
bash复制# 查看当前目录最大的10个文件
ls -lhS | head -10
# 统计某个进程的个数
ps aux | grep nginx | grep -v grep | wc -l
# 查看系统内存使用状况并排序
free -m | sort -k2 -n
重定向则是把命令的输出写到文件里,而不是显示在屏幕:
bash复制# 覆盖写入
echo "hello" > test.txt
# 追加写入
echo "world" >> test.txt
# 错误输出重定向
ls /nonexistent 2> error.log
# 标准输出和错误输出都重定向
ls /nonexistent > all.log 2>&1
这里的2>&1意思是将文件描述符2(标准错误输出)重定向到文件描述符1(标准输出)所指向的地方。这个写法很常见,如果记不住,直接写成&>在bash里也可以达到同样效果:
bash复制ls /nonexistent &> all.log
管道和重定向配合使用,能解决很多工作中的实际问题。比如把日志中某个时间段的内容抽出来保存:
bash复制sed -n '/2025-01-01 10:00/,/2025-01-01 11:00/p' app.log > hour.log
这条命令把app.log中从10点到11点之间的日志提取出来存到hour.log。sed的-n参数配合p命令表示“只打印匹配到的内容”,否则sed会把每一行都打印出来,那就没意义了。
4. 用户与权限基础:新建用户、文件权限这些操作一次说清
4.1 新建用户:useradd 和 adduser 到底有什么区别
热词里有“linux新建用户”,这是初学者很容易搞混的一个点。Linux下创建用户有两个命令:useradd和adduser。
useradd是底层命令,所有Linux发行版都有,参数非常丰富。adduser在Debian/Ubuntu系里是一个更友好的封装脚本,它会交互式地引导你设置密码、填写用户信息等;在CentOS/RHEL系里,adduser其实只是useradd的符号链接,两者没有区别。
如果你用的是CentOS,那直接用useradd就好。基本用法:
bash复制sudo useradd -m -s /bin/bash zhangsan
这个命令的参数解释一下:
-m:创建用户的同时创建用户主目录(/home/zhangsan)-s /bin/bash:指定用户的登录shell为bash,如果不指定,默认可能是/bin/sh,交互体验有差别
创建完用户后,还需要设置密码:
bash复制sudo passwd zhangsan
系统会提示输入两次密码,输入的时候不会显示任何字符,这是正常的,不是键盘坏了。
如果你想批量创建用户并设置初始密码,可以用echo配合管道一次完成:
bash复制echo "Zhangsan@123" | sudo passwd --stdin zhangsan
注意,--stdin参数在Debian系的passwd上可能不支持,这是给CentOS用的。如果可以的话,还是建议手动执行passwd交互式设置,避免密码出现在shell历史记录里。
4.2 用户加组、切换和删除:配套操作要跟上
创建用户之后,最常见的操作是把用户加入某个用户组。比如把zhangsan加到sudo组,让他拥有管理员权限:
bash复制sudo usermod -aG sudo zhangsan
这里-aG的意思是append(追加)到某个组。-a(append)这个参数非常重要,如果不加,usermod -G sudo zhangsan会把用户从其他所有组中移除,只保留sudo组,这是一个很容易踩的坑。
查看用户所属的所有组:
bash复制groups zhangsan
删除用户是另一个需要小心的操作:
bash复制sudo userdel -r zhangsan
-r参数表示同时删除用户的主目录和邮件目录。如果不加-r,用户虽然被删除了,但它的主目录文件还会留在系统里。我建议:如果是确定不再使用的用户,用-r连带主目录一起清理;如果只是暂时禁用,更温和的做法是锁住用户:
bash复制sudo usermod -L zhangsan
# 解锁
sudo usermod -U zhangsan
锁定的用户无法登录,但数据和文件都保留,等确认没问题后再彻底删除。
还有一个很多人不知道的点:修改用户的主目录或登录shell:
bash复制# 修改用户主目录
sudo usermod -d /data/zhangsan -m zhangsan
# 修改登录shell
sudo chsh -s /bin/zsh zhangsan
chsh是一个单独的命令,专门用来修改用户的登录shell。-s后面跟shell的绝对路径。
4.3 文件权限:chmod 和 chown 不是乱用的
用户创建好了,就涉及到文件和目录的权限问题。Linux的权限模型用rwx三位表示:r(read读)、w(write写)、x(execute执行)。ls -l看到的第一列,比如-rw-r--r--,第一个字符表示文件类型(-普通文件,d目录,l链接),后面三位是属主权限,再三位是属组权限,最后三位是其他人权限。
chmod命令用来修改权限,有两种用法。一种是符号模式:
bash复制chmod u+x file.sh # 给属主加执行权限
chmod g-w file.txt # 去掉属组的写权限
chmod o=r file.txt # 其他人的权限设置为只读
chmod a+r file.txt # 所有人(all)加读权限
另一种是数字模式:
bash复制chmod 755 file.sh
数字模式中,r=4,w=2,x=1,加起来就是权限值。755表示属主有rwx(4+2+1=7),属组有r-x(4+1=5),其他人有r-x(5)。644表示属主rw-,属组和其他人r--,这是普通文件的常见权限。600表示只有属主能读写,是配置文件的常见权限。
在实际环境中,我见过最多的权限问题是:为了省事,直接chmod 777——把文件改成任何人可读可写可执行。这在隔离的测试环境里无伤大雅,但生产环境千万不要这么干。攻击者一旦发现一个777权限的目录,就可以在里面放置恶意脚本。正确做法是临时调整权限到最小可用范围,用完就改回来。
chown命令用来修改文件的属主和属组:
bash复制# 修改属主
sudo chown zhangsan file.txt
# 同时修改属主和属组
sudo chown zhangsan:developers file.txt
# 递归修改目录下所有文件
sudo chown -R zhangsan:developers /data/project
常见的需求是部署网站的时候,把/var/www/html目录的属主改成nginx或www用户:
bash复制sudo chown -R www-data:www-data /var/www/html
这里www-data是Debian系Nginx默认使用的用户。如果你不确定nginx是以哪个用户身份运行的,可以查看配置文件或者执行ps aux | grep nginx,第一列就是用户名。
4.4 sudo:临时提升权限的正确姿势
普通用户要做系统级操作时,需要借助sudo。sudo的全称是“superuser do”,作用是以指定用户(默认为root)的身份执行命令。
使用sudo前需要确保当前用户被加入sudo组(Debian系)或wheel组(CentOS系)。CentOS上添加用户到sudo权限组:
bash复制sudo usermod -aG wheel zhangsan
执行sudo的时候,系统会要求输入当前用户的密码(不是root的密码)。这个密码输入一次后,默认5分钟内再次执行sudo不需要重复输入,这是sudo的缓存机制。
sudo执行高频命令时会反复提示密码,如果觉得麻烦,可以用sudo -i切换为root身份:
bash复制sudo -i
# 之后所有命令都直接执行,不需要再前缀sudo
exit # 退出root身份
不过我不建议日常操作一直挂在root下,容易误操作。我自己的习惯是:普通操作用普通用户,遇到需要权限的操作才加sudo。这样即使敲错了命令,影响范围也可控。
还有一个实用技巧:查看当前用户能执行哪些sudo命令:
bash复制sudo -l
这个命令会列出当前用户被授权的sudo命令列表。如果你帮别人配置了sudo权限,可以用这个命令验证配置是否正确。
5. 排查与自救:查看进程、端口和服务状态的一套组合拳
5.1 进程排查:ps 和 top 的正确打开方式
服务器出问题的时候,第一个要搞清楚的就是“当前系统上跑了哪些进程、哪个进程占用了大量资源”。热词里的“linux常用命令大全运维”很多内容都跟这个场景相关。
ps命令用来查看当前进程的快照,最常用的组合是:
bash复制ps aux
这个命令列出所有用户的进程,展示的信息包括:进程所属用户、进程ID(PID)、CPU使用率、内存使用率、运行状态、启动命令等。au和x这两个参数的含义不用深究,记住组合就行。
如果想精确查找某个进程,配合grep:
bash复制ps aux | grep nginx
但这样会有一个问题:grep本身也会作为一个进程出现在结果里。所以通常会再排除掉grep自己:
bash复制ps aux | grep nginx | grep -v grep
或者用pgrep直接精确匹配:
bash复制pgrep -a nginx
-a参数会显示完整的启动命令。
top命令则是一个动态刷新版的ps,它会持续显示系统资源占用情况。启动后选择一个整数刷新周期推荐用top -d 1:
bash复制top -d 1
-d 1表示每1秒刷新一次,适合实时观察。在top界面中按P按CPU使用率排序,按M按内存使用率排序,按q退出。
实际排查的时候经常要找到“是哪个进程占用了某个端口”,这个需求可以用ss命令完成:
bash复制ss -tlnp | grep 8080
参数含义:-t显示TCP连接,-l显示监听中的端口,-n不解析主机名(显示IP地址而非域名),-p显示对应的进程信息。如果这组命令执行后没有输出,说明8080端口没有被监听。如果看到一个进程的PID,就可以用ps -p PID查看这个进程的详细信息。
5.2 服务管理:systemctl 是现代Linux的标准操作方式
现代Linux发行版基本都用systemd来管理服务,操作命令以systemctl为核心。常用的组合如下:
bash复制# 查看服务状态
sudo systemctl status nginx
# 启动服务
sudo systemctl start nginx
# 停止服务
sudo systemctl stop nginx
# 重启服务(改了配置之后常用)
sudo systemctl restart nginx
# 重新加载配置(不中断服务,适合改完配置后)
sudo systemctl reload nginx
# 设置开机自启动
sudo systemctl enable nginx
# 取消开机自启动
sudo systemctl disable nginx
# 查看所有正在运行的服务
systemctl list-units --type=service --state=running
这里要区分一下restart和reload:restart会完全停掉服务再启动,期间服务不可用;reload则是让服务重新读取配置文件,不中断服务。改配置后能用reload就尽量用reload,这样对外服务不会中断。
热词里提到了“linux安装nginx”,安装完成后的标准操作流程是这样的:
bash复制# 安装(以Debian系为例)
sudo apt update
sudo apt install nginx
# 启动并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx
# 确认运行状态
sudo systemctl status nginx
# 如果是CentOS,则用yum或dnf
# sudo yum install nginx
安装完成后访问服务器IP,能看到Nginx的默认欢迎页就说明安装成功了。如果访问不了,先确认防火墙有没有放行80端口:
bash复制# 查看防火墙状态
sudo ufw status
# 放行80端口
sudo ufw allow 80/tcp
CentOS的防火墙管理命令不太一样,用的是firewall-cmd:
bash复制sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --reload
5.3 系统信息:快速摸清一台服务器的“身体状况”
排查问题的时候,除了进程和端口,还需要快速了解系统的基本信息。我整理了一个自查清单:
bash复制# 查看系统版本(很多人一上来就ls /etc,这个更直观)
cat /etc/os-release
# 查看内核版本
uname -a
# 查看CPU信息
lscpu
# 查看内存使用
free -h
# 查看磁盘使用
df -h
# 查看目录占用
du -sh /var/log
# 查看系统运行时间和负载
uptime
# 查看登录历史
who
last
这里free -h和df -h里的-h是human-readable的意思,用人类可读的格式显示(比如GB、MB)。不带-h的话显示的是字节数,一大串数字看起来非常费劲。
df -h是查磁盘空间最常用的命令。查出来某个分区满了,通常需要配合du -sh逐级定位是哪个目录占用的空间:
bash复制du -sh /var/* | sort -rh | head -10
这条命令会把/var/下每个目录的占用情况列出来,按大小从大到小排序,只看最大的前10个。sort -rh里,-r是倒序,-h是识别人类可读的大小单位(1K、2M、3G这种)而不是按字母排序。
像/var/log/journal这种目录经常莫名其妙占掉几个G,就是因为系统日志积累太多。安全清理方式是:
bash复制# 清理超过7天的系统日志
sudo journalctl --vacuum-time=7d
5.4 日志查看:排查问题的第一手材料
出现问题时,查看日志往往比查代码更高效。系统和服务日志都集中在/var/log目录下:
/var/log/messages或/var/log/syslog:系统整体日志/var/log/nginx/access.log:Nginx访问日志/var/log/nginx/error.log:Nginx错误日志/var/log/mysql/error.log:MySQL错误日志
查看日志的核心原则是:用tail看最新的,用grep过滤关键的,用less翻页仔细看。比如Nginx报错了,先看错误日志最后几十行:
bash复制tail -n 50 /var/log/nginx/error.log
如果日志量太大一屏放不下,用less打开搜索关键字:
bash复制less /var/log/nginx/error.log
# 进入后按 / 输入关键字搜索
我遇到过很多次“服务器挂了但不知道原因”的情况,最后都是靠日志定位的。有一次线上服务突然变慢,排查后发现是磁盘写满导致数据库写入超时;有一次网站打不开,看日志发现是Nginx配置里的worker_connections设得太低导致连接被拒绝。这些坑如果不看日志,靠猜的话效率太低了。
6. 高频命令组合与实用小技巧:让日常操作顺手起来
6.1 几个我每天都会用到的命令组合
基础指令学了那么多,最终要落实到“组合起来用”。这里分享几个我实际工作里高频使用的组合,可以直接抄作业。
批量查找并替换文件内容
bash复制grep -rl "old_text" /data/project | xargs sed -i 's/old_text/new_text/g'
这条命令先递归查找/data/project目录下哪些文件包含old_text(-r递归,-l只列出文件名),然后通过管道把文件名交给xargs,由xargs逐个传给sed执行替换。如果文件数量特别多,建议先去掉管道后半段,单独跑一遍grep -rl确认结果。
按文件大小查找大文件
bash复制find / -type f -size +500M -exec ls -lh {} \; 2>/dev/null
这条命令会在全盘查找超过500M的文件,并列出详细大小。2>/dev/null是把权限不足的错误信息扔掉,避免刷屏。磁盘快满的时候,用这个命令快速定位哪些大文件可以清理。
打包并压缩指定目录
bash复制tar czf backup_$(date +%Y%m%d).tar.gz /data/www
tar的czf参数解释:c创建归档,z用gzip压缩,f指定归档文件名。利用$(date +%Y%m%d)动态生成带日期的文件名,每天备份就不会覆盖前一天的。解压则用:
bash复制tar xzf backup_20250101.tar.gz -C /tmp/restore
-C参数指定解压到哪个目录。
远程复制文件
bash复制scp file.txt user@192.168.1.10:/data/
scp基于SSH协议传输文件,user是远程服务器的用户名,192.168.1.10是远程服务器IP,/data/是目标路径。如果远程SSH端口不是默认的22,用-P指定:
bash复制scp -P 2222 file.txt user@192.168.1.10:/data/
6.2 命令历史的妙用:效率和安全两不误
热词里的“linux常用命令60条csdn”这类内容大家肯定没少看,但有一件事比背60条命令更有用:学会高效地翻阅命令历史。
每次在终端里输入的指令都会被记录在~/.bash_history文件里。几个常用的历史操作:
bash复制history # 查看历史命令列表
!! # 重复执行上一条命令,刷sudo的时候最常用
!ls # 重复执行最近一条以ls开头的命令
Ctrl + R # 反向搜索历史,输入关键字就能找到以前的命令
Ctrl+R是效率提升神器。比如你记得上次执行过一个很长的docker命令,但记不清具体参数,按下Ctrl+R后输入docker,shell会实时匹配历史记录,多次按Ctrl+R可以向上翻找,找到后直接回车执行。
关于安全,我要特别提醒一点:不要直接在命令行里输入密码类的敏感信息,因为history会记录下来。如果已经输入了,可以手动清理:
bash复制history -d 行号 # 删除某条记录
history -c # 清空整个历史
如果临时执行一个不想进历史的命令,可以在命令前加一个空格:
bash复制 echo "这是敏感信息" > secret.txt
注意,这个技巧在默认bash配置下是生效的,前提是HISTCONTROL环境变量包含ignorespace。可以预先检查:
bash复制echo $HISTCONTROL
如果不包含ignorespace,可以在~/.bashrc里加上:
bash复制export HISTCONTROL=ignorespace
6.3 别名和环境变量:把你的shell调教成顺手的样子
最后一个实用技巧是关于~/.bashrc的配置。刚开始用Linux的读者可能不知道:这个文件在你每次打开终端时都会执行,可以把它理解成你shell环境的“启动配置”。
我最常用的几个别名:
bash复制alias ll='ls -alF'
alias ..='cd ..'
alias ...='cd ../..'
alias grep='grep --color=auto'
alias cls='clear'
alias ports='ss -tlnp'
设置好之后执行source ~/.bashrc让配置立即生效。这样日常操作会顺手很多。
还有几个环境变量值得花时间设置:
bash复制# 让less支持UTF-8中文
export LESSCHARSET=utf-8
# 设置默认编辑器
export EDITOR=vim
# 命令历史数量加大
export HISTSIZE=10000
export HISTFILESIZE=20000
# 设置终端提示符格式
export PS1='[\u@\h \W]\$ '
PS1这个变量控制着命令行提示符的显示格式,\u用户名,\h主机名,\W当前目录名(只显示最后一级),\$在普通用户下显示$,root下显示#。改完之后终端提示符会变成[zhangsan@myserver www]$这样,一眼就能看清当前是谁在哪台机器上在哪个目录下操作,多多少少能减少一些误操作的几率。
还有一个环境变量要特别提醒:
bash复制export PATH=$PATH:/my/custom/bin
这是在原有PATH后面追加新目录,不会破坏系统原有配置。如果写成export PATH=/my/custom/bin,就把之前的所有路径都覆盖了,ls、cat这些基础命令可能都找不到,连终端都会变得不正常。这种低级事故我见过不止一次,改PATH的时候务必小心。
7. 结尾:几点真实的个人体会
写到这,基础指令系列的第4篇差不多就结束了。回头看一下,这一篇讲的其实都不是什么高深的技术,但每一条命令背后都是实际工作场景里摸爬滚打总结出来的经验。比如rm -rf慎用、chmod 777别乱给、tail -f看日志、Ctrl+R搜历史,这些东西单独拿出来都很简单,但它们组合在一起,搭建起了日常Linux操作的骨架。
我个人实际使用中的体会是,Linux命令不需要一次记住很多,关键是建立一个“遇到问题知道可以用什么命令解决”的索引。当你需要批量替换文件内容时,能想起来有个叫sed的工具;当服务器变慢时,能想起用ps aux和free -h先看资源占用;当服务起不来时,能想起去/var/log下面找日志。这些“想起来”比“背下来”重要得多。
还有一个建议:练习的时候别怕搞坏系统。现在虚拟机、云服务器、WSL这么方便,随便开一个环境随便折腾。我见过太多人因为“怕弄坏”而不敢碰命令,反而一直停在原地。放心去敲,Linux没有想象中那么脆弱,等你真正搞坏过几次再修好,这些命令的记忆就会特别牢固。
下一篇系列文章里,如果你们想知道管道和重定向的更多玩法、Shell脚本的入门写法,或者Nginx这类常用服务的配置细节,可以留言告诉我,我根据大家最关心的内容来安排。
