Linux 基础命令与目录结构
最早接触 Linux 的时候,最不习惯的是两件事:一是"一切皆文件",二是没有 C 盘 D 盘,所有东西都从一个 / 往下挂。那时候我记命令的方式是硬背,背了忘、忘了背,效率极低。后来才发现,命令根本不用背全——真正每天在用的就那么十几条,剩下的查手册就行。真正需要先想清楚的,是"目录树每一层是干嘛的"和"权限到底怎么算的"。这篇不是那种从头讲到尾的说明书,是把我自己平时怎么用的顺序整理出来,当备忘录用。
一、根目录:每个位置各管一摊
Linux 只有一个根 /,所有东西都挂在它下面。刚上手时会觉得乱,其实是分工太明确了——每个目录都有它该干的事,只是没人告诉你。我整理了一下自己常打交道的几个:
| 路径 | 装的是什么 | 我的使用习惯 |
|---|---|---|
/home | 普通用户的家目录,你自己的文件基本都在这里 | 登录后默认就落在这附近,个人脚本放 ~/bin |
/etc | 系统与软件的配置 | 改任何程序的配置,第一反应就是来这找 |
/var | 会不断变化的数据:日志、缓存、队列 | 查问题先看 /var/log,网站文件多在 /var/www |
/tmp | 临时文件 | 重启可能就没了,我从不在这存东西 |
/opt | 自己额外装的大型第三方程序 | 我把自己的项目放在 /opt 下,跟系统的东西隔开 |
/usr | 系统装的可执行文件与库 | 只读心态,不手动往里塞东西 |
ls -lh 看一眼里面有什么、权限是什么,比直接进去乱翻安全得多。养成习惯之后,"这个文件是谁的、能不能改"这个问题基本不用问人。二、按场景记命令,比按字母表记靠谱
我试过按字母表背命令,效果很差——因为记住了字母,遇到问题还是想不到该用哪条。后来改成按"我要干嘛"来分组记,明显更实用。下面这四组,覆盖了我 90% 的日常操作。
场景一:先搞清楚"我在哪、这有什么"
# 我在哪个目录
pwd
# 这底下有什么(-l 详细 / -h 人类可读的单位 / -a 含隐藏文件)
ls -lh
ls -lah
# 目录有多大,一级一级看是哪个占地方
du -sh *
du -h --max-depth=1 /var | sort -h
# 磁盘还剩多少(最常被忽略、又最容易出事的一条)
df -h
这几条里,df -h 我是吃过亏才养成习惯的。磁盘写满之后,很多程序不会报"磁盘满",而是行为诡异——日志写不进去、上传直接失败,排查半天找不到原因。现在我每天上手的第一件事就是瞄一眼剩余空间。
场景二:看内容、翻日志
# 看整个文件
cat app.conf
# 长文件一页页翻,q 退出;/ 是搜索
less app.log
# 只看最后 100 行,日志排错最常用
tail -n 100 app.log
# 实时盯着日志往下滚(Ctrl+C 退出)
tail -f app.log
# 从一堆日志里捞关键字
grep -n "ERROR" app.log
grep -rn "timeout" /var/log/
tail -f 是我用得最多的一条。程序在跑、你改了配置想确认有没有生效,直接盯着这个窗口看它有没有新报错,比反复重启去猜直观。
场景三:搬文件、做备份
# 建目录,-p 表示父目录不存在也一起建
mkdir -p /opt/app/data
# 复制(-r 递归 / -a 保留权限与时间)
cp -a /opt/app /opt/app.bak
# 移动或改名
mv old.txt new.txt
# 删除(危险,见下面坑点)
rm -rf old_dir
# 跨机器传文件
scp -r ./dist user@host:/var/www/
rm -rf 后面的路径一定要盯着看完再回车。我给自己定的规矩是:删之前先 ls 一遍同一个路径,确认看到的东西就是我以为要删的那些,然后再把命令里的 ls 改成 rm -rf。多花三秒,能避免一次事后后悔。场景四:看进程和端口
# 程序在不在跑
ps aux | grep node
# 谁占着 443 端口(这个非常常用)
ss -ltnp | grep :443
# 本机能不能通到某个端口
curl -I http://127.0.0.1:8000
# 结束一个进程
kill <PID>
kill -9 <PID> # 强制,最后手段
三、权限那三个数字到底怎么来的
权限是初学者最容易含糊过去的一块。其实拆开看很简单——rwx 三个字母,换成数字就是 4 + 2 + 1 = 7,然后按"拥有者 / 同组用户 / 其他人"排三组,就是那三位数。
# 给文件设权限
chmod 644 index.html # 拥有者可读写,其他人只读
chmod 755 deploy.sh # 脚本要给执行位
# 改归属:把文件交给运行它的那个用户
chown -R www-data:www-data /var/www/snapzp
# 看当前用户属于哪些组
groups
chown 调一下就好,别急着改成 777。说到 777,我的态度很明确:尽量不要用。它是"给所有人全部权限",能让报错立刻消失,但同时也把问题藏起来了。先用 ls -l 看清属主和权限,多数情况下把属主改对就够了。
四、让程序关掉终端也不死
自己写的程序要一直跑着,不能一关终端就没了。以前大家用 nohup 加 &,现在更规范的方式是交给 systemd——它管开机自启、管崩溃拉起、管日志,一个配置文件全解决。
# /etc/systemd/system/myapp.service
[Unit]
Description=My App
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/node /opt/myapp/app.js
Restart=always
RestartSec=3
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
写完配置,四条命令走完流程:
systemctl daemon-reload # 改了配置文件就先执行这条
systemctl enable myapp # 开机自启
systemctl start myapp # 立即启动
systemctl status myapp # 看状态
journalctl -u myapp -n 100 # 看它的日志,-f 可以实时跟
journalctl -u myapp --since "10 min ago"
journalctl,不用自己写重定向;Restart=always 让程序崩了自动起来,半夜挂掉不用等人救;改了配置 daemon-reload 一下就行,不用记各种后台进程的 PID 文件放哪。五、我自己踩过的几个坑
- 在错误的目录里执行了删除当时想删一个旧的备份目录,结果连着上一层的业务目录一起删了。原因就是没先
pwd、没先ls。从那以后我删任何东西之前都先看一眼当前路径。 - 磁盘悄悄写满日志一直追加、没人清理,最后磁盘满了。程序表现是"上传莫名失败",但报错信息完全不提磁盘。现在我会定期用
df -h和du -sh *看一眼。 - 权限改错层改了文件权限但没改文件所属目录的权限,程序依旧读不到。目录本身需要有
x才能进去,这一点最容易被忽略。 - 改了配置没重载编辑完
.service直接start,发现还是老行为。原因是漏了systemctl daemon-reload,systemd 还在用旧配置。
小结
把这几件事做顺,一个最基础的 Linux 工作流就通了:知道自己在一个树状目录的哪一层 → 用 ls/df/du 看清现状 → 用 chmod/chown 把权限摆正 → 用 systemd 把程序常驻起来 → 出问题去 /var/log 和 journalctl 找线索。剩下都是具体场景里的经验积累,不用一次性学完。