目录
一、文件与目录:一切从 ls 说起
-
ls
场景:99 % 的时间都花在浏览目录。
语法:ls -lha --color=auto
技巧:配合 dircolors 自定义颜色,一眼区分管道文件、可执行文件、压缩包。
陷阱:在挂载了大量小文件的目录里直接 ls -l 会阻塞,用 ls -1(数字 1)或 find 代替。 -
tree
场景:需要把目录结构发给同事或写文档。
语法:tree -L 3 -I 'pycache|*.pyc'
技巧:tree -H . > index.html 可一键生成带超链接的网页版目录树。
陷阱:符号链接循环会导致 tree 死循环,记得 -l 选项。 -
touch / mkdir -p
场景:创建空文件或级联目录。
语法:mkdir -p /opt/app/{bin,conf,logs}
技巧:touch file{01..12}.log 一次生成 12 个日志文件。
陷阱:touch 可以篡改 mtime 做“假日志”,审计时要留意。
二、文件查看与内容检索
-
cat / tac / less / tail -f
场景:小文件 cat,大文件 less,实时日志 tail -f。
技巧:less +F file.log 等价于 tail -f,但随时 Ctrl+C 回到 less 浏览模式。
陷阱:cat 二进制文件会污染终端,用 reset 或 echo -e '\033c' 救场。 -
grep / ripgrep (rg)
场景:快速找代码或日志关键字。
语法:rg -i 'error.*timeout' --type py -C3
技巧:rg 默认忽略 .gitignore,比 grep -r 更“懂”项目。
陷阱:grep -R 不会忽略二进制文件,加 -I 可提速。 -
awk / sed
场景:按列切分、批量替换。
语法:awk -F: '$3>=1000{print $1}' /etc/passwd
技巧:sed -i.bak 's/http:/https:/g' *.md 自动备份。
陷阱:macOS 的 sed -i 必须加 '',否则报错。
三、文件传输:scp 老去,rsync 当立
-
rsync
场景:增量同步、带进度、可断点续传。
语法:rsync -avzP --exclude=.git /data/ root@backup:/bak/
技巧:rsync --link-dest 实现每日硬盘快照,只存差异。
陷阱:末尾斜杠决定同步的是目录本身还是目录里的内容。 -
scp / sftp
场景:临时拷一个文件,或图形化工具 FileZilla 后台。
语法:scp -C -l 8192 big.iso user@host:/tmp/
技巧:scp -3 host1:file host2:file 不走本地中转。
陷阱:OpenSSH 9.x 已标记 scp 为“过时”,推荐用 sftp。
四、系统资源监控:top 三兄弟
-
top / htop
场景:看 CPU、内存、Load。
技巧:htop F6 可按任意列排序,F9 杀进程;top -H -p PID 看线程。
陷阱:top 默认不显示 I/O,需安装 iotop。 -
free -h / vmstat 1
场景:快速确认内存瓶颈。
技巧:vmstat 1 第 1 列的 si/so 持续非 0 说明在疯狂 swap。
陷阱:free 看到的 available 才是真的可用内存,别被 used 吓到。 -
df -h / ncdu
场景:磁盘吃满。
技巧:ncdu / 10 秒生成互动式目录大小报告,方向键直接删。
陷阱:ext4 预留 5 % root 空间,df 看到 100 % 还能写一点。
五、进程与信号:kill 不止是 9
-
ps aux / pgrep / pkill
场景:查僵尸、杀进程。
语法:pkill -9 -f 'python manage.py'
技巧:ps -eo pid,ppid,lstart,cmd 看父子关系和启动时间。
陷阱:kill -9 可能导致数据不一致,先试试 -15。 -
nohup / setsid / disown
场景:让进程脱离终端。
语法:nohup ./long.sh &>run.log &
技巧:disown -a 把已运行的作业彻底托管给 init。
陷阱:nohup 不会自动把 stdin 重定向到 /dev/null,手动加 <&-。 -
systemd-run / at / cron
场景:一次性或定时任务。
语法:systemd-run --on-calendar='Mon --* 03:00' /usr/local/bin/backup.sh
技巧:at now + 1 hour 适合“30 分钟后重启 nginx”这种临时需求。
陷阱:cron 不继承系统 PATH,务必写全路径。
六、网络诊断:ip 时代别再用 ifconfig
-
ip / ss
场景:取代 ifconfig、netstat。
语法:ip -br a; ss -tulpn
技巧:ss -o state established '( dport = :80 or sport = :80 )' 查 80 端口活跃连接。
陷阱:ss 比 netstat 快,但老脚本可能不兼容。 -
ping / mtr / traceroute
场景:线路质量。
技巧:mtr -r 8.8.8.8 生成文本报告,适合邮件发送。
陷阱:运营商 ICMP QoS 可能丢包,用 tcptraceroute -p 80 更真实。 -
curl / wget / httpie
场景:接口调试。
语法:http -v POST pie.dev/post hello=world token:==abc123
技巧:curl -H @headers.txt -d @body.json URL 复用文件。
陷阱:curl -L 追踪重定向,但 30x 到 file:// 会下载本地文件,注意安全。
七、权限模型:chmod 数字背后的位运算
-
chmod / chown / chgrp
场景:网站目录 755、密钥 600。
技巧:chmod -R g+wX . 仅给目录加 SGID,并保证文件可执行位不被误改。
陷阱:chmod 777 永远不是解决方案,用 ACL:setfacl -m u:nginx:rwx uploads/。 -
umask
场景:默认权限。
技巧:在 ~/.bashrc 写 umask 027,确保同组无写权限。
陷阱:sftp 上传文件受 umask 影响,可能导致 web 无法写日志。 -
sudo / su / doas
场景:最小权限原则。
技巧:sudo -E 保留当前用户环境变量,sudo -i 打开 root login shell。
陷阱:sudoers 里 ALL=(ALL) NOPASSWD:ALL 等于送 root。
八、压缩与归档:tar 的一百种写法
-
tar
场景:打包源码、备份。
语法:tar --zstd -cvaf code.tar.zst src/
技巧:tar --exclude-vcs --exclude='*.o' -cpf - src/ | ssh host 'tar -C /backup -xpf -' 纯流式远程备份。
陷阱:tar -czf 不能并行,pigz -p 8 可加速。 -
zip / unzip
场景:与 Windows 交互。
技巧:zip -r -P secret code.zip dir/ 加密码,但可被 pkcrack。
陷阱:unzip 默认覆盖同名文件,加 -n 或 -o 前确认。 -
rsync --compress / zstd / pigz
场景:压缩传输两不误。
技巧:rsync -avz --compress-choice=zstd 比 gzip 快 3~5 倍。
陷阱:压缩率过高会吃 CPU,低带宽才划算。
九、包管理:apt、yum、dnf、pacman 一条龙
-
apt
场景:Debian/Ubuntu。
技巧:apt list --upgradable | grep -v security 先过滤非安全更新。
陷阱:删除包用 apt purge 才能连配置一起清。 -
yum / dnf
场景:RHEL/CentOS/Fedora。
技巧:dnf history undo 23 回滚到第 23 次事务。
陷阱:CentOS 7 默认 yum 插件 fastestmirror 可能选到慢镜像,手动改 repo。 -
snap / flatpak / AppImage
场景:跨发行版应用。
技巧:snap set system refresh.hold="$(date +%Y-%m-%d --date='2 weeks')" 暂停自动更新。
陷阱:snap 挂载 loop 设备过多,用 losetup -D 清理。
十、开发调试:strace 到 journalctl
-
strace / ltrace
场景:程序卡住、系统调用黑洞。
语法:strace -f -e trace=network -s 1024 -o strace.log curl example.com
技巧:-e inject=open:retval=-1 模拟文件不存在。
陷阱:容器里 strace 需要 --cap-add=SYS_PTRACE。 -
journalctl
场景:Systemd 时代日志归一。
语法:journalctl -u nginx -p err --since '2025-08-23 00:00'
技巧:journalctl -f _UID=1000 实时跟踪某用户日志。
陷阱:默认日志存 /run/log,重启即失,需改 /etc/systemd/journald.conf。 -
git / diff / patch
场景:版本控制与打补丁。
技巧:git log --oneline --graph --all 画 ASCII 树。
陷阱:patch -p1 < ../fix.patch 时路径层级别搞错。
结语
• 把 man 和 tldr 结合起来:man 给“官方文档”,tldr 给“人类示例”。
• 每天学一个“冷门但实用”的指令,如 fuser、rename、shuf、column。
• 把常用命令封装成函数或脚本放到 ~/bin,并让 PATH 优先包含它。