为什么程序员必须懂 Linux?
你可能听说过这些场景:
部署项目到服务器:ssh 连上去,ls 看看文件,vim 改改配置,systemctl restart nginx 重启服务
线上排查问题:top 看 CPU,df -h 看磁盘,tail -f 看日志,grep 找错误
批量处理文件:find + xargs + sed 一行命令完成,而图形界面要点几百下鼠标
Linux 是程序员的“第二操作系统”。不管你平时用 Windows 还是 macOS,服务器 90% 以上跑的都是 Linux。
本文将从零开始,系统讲解初级程序员必须掌握的 Linux 命令,覆盖:
文件操作:ls、cd、cp、mv、rm、find
文本处理:cat、grep、sed、awk、vim
权限管理:chmod、chown、useradd
进程管理:ps、top、kill、systemctl
网络工具:ssh、scp、curl、netstat
系统监控:df、du、free、htop
每一部分都有详细的命令解释、参数说明和实战案例。
一、Linux 基础概念:先理解“是什么”
1.1 Linux 的哲学
1.2 文件系统结构
/ # 根目录
├── bin/ # 基本命令(ls, cp, mv)
├── boot/ # 启动文件(内核)
├── dev/ # 设备文件(硬盘、终端)
├── etc/ # 配置文件(nginx, ssh)
├── home/ # 用户家目录
│ ├── user1/
│ └── user2/
├── lib/ # 共享库文件
├── media/ # 挂载点(U盘、光驱)
├── mnt/ # 临时挂载点
├── opt/ # 第三方软件
├── proc/ # 进程信息(虚拟文件系统)
├── root/ # root 用户家目录
├── sbin/ # 系统管理命令
├── tmp/ # 临时文件(重启会清空)
├── usr/ # 用户程序和数据
│ ├── bin/ # 用户命令
│ ├── lib/ # 用户库
│ └── local/ # 本地安装软件
└── var/ # 可变数据
├── log/ # 日志文件
└── www/ # Web 服务器数据
1.3 路径规则
# 绝对路径:从根目录开始
/home/user/project/index.js
# 相对路径:从当前目录开始
./index.js # 当前目录
../config.js # 上一级目录
../../package.json # 上两级目录
# 特殊目录
. # 当前目录
.. # 上一级目录
~ # 用户家目录
- # 上一个工作目录
二、文件与目录操作(高频命令)
2.1 ls - 列出目录内容
# 基础用法
ls # 列出当前目录(不含隐藏文件)
ls -a # 列出所有文件(包括 . 开头的隐藏文件)
ls -l # 长格式显示(权限、链接数、所有者、大小、时间)
ls -lh # 人类可读的大小(1K、2M、3G)
ls -la # 所有文件 + 详细信息
ls -ltr # 按修改时间排序(最新的在最后)
ls -lS # 按文件大小排序(最大的在前)
ls -R # 递归列出子目录
# 通配符
ls *.js # 所有 .js 文件
ls file?.txt # file1.txt、file2.txt(? 匹配单个字符)
ls file[0-9].txt # file0.txt 到 file9.txt
ls {src,test}/*.js # src/ 和 test/ 下的 .js 文件
# 实际案例
ls -la | grep "^d" # 只显示目录
ls -la | grep "^-" # 只显示文件
2.2 cd - 切换目录
cd /var/log # 切换到绝对路径
cd ./src # 切换到相对路径
cd .. # 上一级目录
cd ../.. # 上两级目录
cd ~ # 回到家目录
cd - # 回到上一个目录
# 设置别名(添加到 ~/.bashrc 或 ~/.zshrc)
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
2.3 pwd - 显示当前路径
pwd # /home/user/project
pwd -P # 显示真实路径(不解析符号链接)
2.4 mkdir - 创建目录
mkdir myfolder # 创建单个目录
mkdir folder1 folder2 folder3 # 创建多个目录
mkdir -p parent/child/grandchild # 创建多级目录(父目录不存在时自动创建)
mkdir -m 755 secure_folder # 创建时指定权限
# 批量创建目录
mkdir {2024..2026}/{01..12} # 创建 3年×12月 的目录结构
2.5 touch - 创建文件/更新时间戳
touch file.txt # 创建空文件(如果不存在)
touch -t 202401011200 file.txt # 修改时间戳为 2024-01-01 12:00
# 批量创建文件
touch {1..10}.txt # 创建 1.txt 到 10.txt
2.6 cp - 复制文件/目录
cp source.txt dest.txt # 复制文件
cp -i source.txt dest.txt # 覆盖前提示确认
cp -r source_dir/ dest_dir/ # 递归复制目录
cp -u source.txt dest.txt # 只复制更新的文件(源文件更新才复制)
cp -p source.txt dest.txt # 保留文件属性(权限、时间戳)
cp -a source_dir/ dest_dir/ # 归档模式(保留所有属性 + 递归)
# 复制多个文件到目录
cp file1.txt file2.txt file3.txt target_dir/
2.7 mv - 移动/重命名
mv old.txt new.txt # 重命名
mv file.txt ../ # 移动到上一级目录
mv *.js ./src/ # 移动所有 .js 文件到 src
mv -i source.txt dest.txt # 覆盖前提示
mv -u source.txt dest.txt # 只在源文件更新时移动
2.8 rm - 删除文件/目录
rm file.txt # 删除文件
rm -i file.txt # 删除前确认
rm -f file.txt # 强制删除(不提示)
rm -rf folder/ # 强制删除目录及其内容(危险!)
rm -- -file.txt # 删除以 - 开头的文件
# 安全删除(使用 trash-cli 替代 rm)
trash file.txt # 移动到回收站
trash-empty # 清空回收站
2.9 find - 查找文件
# 按名称查找
find . -name "*.js" # 查找所有 .js 文件
find /home -name "config.json" # 在 /home 下查找
find . -iname "README" # 忽略大小写
# 按类型查找
find . -type f # 只查文件
find . -type d # 只查目录
find . -type l # 只查符号链接
# 按大小查找
find . -size +100M # 大于 100MB
find . -size -1M # 小于 1MB
find . -size 0 # 空文件
# 按时间查找
find . -mtime -7 # 7天内修改的文件
find . -mtime +30 # 30天前修改的文件
find . -mmin -60 # 60分钟内修改
find . -newer reference.txt # 比 reference.txt 更新的文件
# 按权限查找
find . -perm 755 # 权限正好是 755
find . -perm -u=w # 用户有写权限
# 执行操作
find . -name "*.tmp" -delete # 删除找到的文件
find . -name "*.js" -exec wc -l {} \; # 统计行数
find . -name "*.log" -exec rm {} \; # 删除日志文件
find . -name "*.jpg" -exec mv {} images/ \; # 移动图片
# 批量重命名(结合 xargs)
find . -name "*.txt" | xargs -I {} mv {} {}.backup