Linux 权限管理
Linux 权限管理
目录
- 权限的基本概念
- 查看权限:ls -l 里的 rwx
- 普通权限修改:chmod
- 修改属主与属组:chown / chgrp
- 目录权限的含义:r/w/x 在目录上的作用
- 特殊权限:setuid / setgid / sticky
- ACL 权限:setfacl / getfacl(进阶)
- 权限掩码:umask 与默认权限
- 不可变属性:chattr(深化)
- 总结与练习
一、权限的基本概念
Linux 是一个多用户系统,通过**权限(Permission)**控制谁能读、写、执行某个文件/目录。
每个文件/目录都有:
- 三种权限:读(r)、写(w)、执行(x)。
- 三类对象:属主(user,u)、属组(group,g)、其他(other,o)。
权限 属主 属组 其他
rwx rwx rwx
│ │ │
│ │ └ 其他用户 other
│ └──────── 属组 group
└────────────── 属主 user
查看文件的所有者信息:
ls -l filename # 查看权限、属主、属组
stat filename # 更详细地查看文件信息(含权限数字表示)
二、查看权限:ls -l 里的 rwx
执行 ls -l 的第一列就是权限字符串,共 10 个字符:
-rwxr-xr-x. 1 root root 1234 ... file
│└┬─┘└┬─┘└┬─┘
│ │ │ │ └── 其他用户(other)的权限
│ │ │ └──── 属组(group)的权限
│ │ └─────── 属主(user)的权限
│ └────────── 第一个字符:文件类型(- 文件,d 目录,l 链接)
└──────────── 第 1 个字符:文件类型
10 个字符的含义:
| 位置 | 含义 |
|---|---|
| 第 1 位 | 文件类型:- 普通文件、d 目录、l 符号链接、b/c 设备 |
| 第 2-4 位 | 属主(user)的 rwx |
| 第 5-7 位 | 属组(group)的 rwx |
| 第 8-10 位 | 其他(other)的 rwx |
r / w / x 分别是什么:
| 权限 | 字母 | 数字 | 含义 |
|---|---|---|---|
| 读 | r | 4 | 读取文件内容 / 列出目录 |
| 写 | w | 2 | 修改文件 / 在目录中增删文件 |
| 执行 | x | 1 | 运行程序 / 进入目录 |
| 无权限 | - | 0 | 无 |
例子:-rwxr-xr-x 表示:
- 属主(u):rwx(读+写+执行)
- 属组(g):r-x(读+执行,无写)
- 其他(o):r-x(读+执行,无写)
注意:
ls -l第一列末尾常有一个.或+:.表示 SELinux 上下文标签(Red Hat 系),+表示存在 ACL(见第七章)。
参考:
man 1 ls、菜鸟教程 - Linux 文件权限
三、普通权限修改:chmod
chmod 用于修改权限,有两种表示法:数字表示法和符号表示法。
3.1 数字表示法(推荐)
把 r=4、w=2、x=1 相加得到一位数字,三类对象各一位:
rwx = 4+2+1 = 7
rw- = 4+2+0 = 6
r-x = 4+0+1 = 5
r-- = 4+0+0 = 4
--- = 0+0+0 = 0
常见组合:
| 数字 | 权限 | 说明 |
|---|---|---|
| 755 | rwxr-xr-x | 属主全权,组和其他只读执行(程序/目录常用) |
| 644 | rw-r--r-- | 属主读写,组和其他只读(普通文件常用) |
| 600 | rw------- | 仅属主可读写(私密文件) |
| 700 | rwx------ | 仅属主全权(私密目录) |
| 777 | rwxrwxrwx | 所有人全权(安全风险高,慎用) |
chmod 755 script.sh # 设置权限为 rwxr-xr-x
chmod 644 file.txt # 设置权限为 rw-r--r--
chmod -R 755 /srv/www # -R 递归修改目录下所有文件
3.2 符号表示法
格式:[对象][操作符][权限]
| 对象 | 含义 | 操作符 | 含义 |
|---|---|---|---|
| u | 属主 | + |
增加权限 |
| g | 属组 | - |
移除权限 |
| o | 其他 | = |
设为(覆盖) |
| a | 所有人(=ugo) |
chmod u+x script.sh # 给属主增加执行权限
chmod g-w file.txt # 移除属组的写权限
chmod o=r file.txt # 其他用户权限设为只读(= 覆盖)
chmod a+r file.txt # 所有人增加读权限
chmod u+rwx,g+rx,o= file # 组合:属主全权,组加 rx,其他无
chmod -R g+w dir/ # 递归给属组加写权限
3.3 数字 vs 符号
- 数字:简洁、一次性设置全部,适合脚本和明确设定。
- 符号:精准增删单项,适合微调。
- 两者可混合理解,掌握数字法最实用。
参考:
man 1 chmod
四、修改属主与属组:chown / chgrp
4.1 chown —— 修改属主(和属组)
sudo chown alice file.txt # 修改属主为 alice
sudo chown alice:dev file.txt # 修改属主为 alice、属组为 dev
sudo chown :dev file.txt # 只修改属组为 dev(前面留空)
sudo chown -R alice:dev dir/ # 递归修改目录及其内容
4.2 chgrp —— 修改属组
chgrp dev file.txt # 修改属组为 dev
chgrp -R dev dir/ # 递归修改
- 修改属主通常需要 root 权限(
sudo)。 - 修改属组:若你是文件属主且是该组成员,通常可直接
chgrp。
参考:
man 1 chown、man 1 chgrp
五、目录权限的含义:r/w/x 在目录上的作用
这是新手最容易懵的点:同一组 rwx 权限,作用在文件和目录上含义完全不同!
5.1 rwx 在文件上的含义
| 权限 | 文件上的作用 |
|---|---|
| r | 读取文件内容(cat、less) |
| w | 修改/覆盖文件内容 |
| x | 执行该文件(脚本、程序) |
5.2 rwx 在目录上的含义
| 权限 | 目录上的作用 |
|---|---|
| r | 列出目录内容(能看到里面有哪些文件,ls) |
| w | 在目录中创建/删除/重命名文件(增删文件) |
| x | 进入/访问该目录(cd、访问其中文件) |
关键理解:
- 目录的
r只能"看到文件名列表",要"进入并访问"文件还需要x。 - 目录的
w控制的是"能否在这个目录里增删文件",与文件本身的权限无关。 - 对目录来说,
x(执行)更像"通行/访问"权限,是最关键的。
5.3 常见目录权限场景
| 目录权限 | 效果 |
|---|---|
| 755(rwxr-xr-x) | 属主全权,其他可进入并读取列表(常见,如 /home、/srv/www) |
| 700(rwx------) | 仅属主可进入和操作,其他人完全进不去(如 /root、个人主目录) |
| 777(rwxrwxrwx) | 任何人都能进入并增删文件(危险,如 /tmp 用特殊方式) |
ls -ld /home # 查看目录本身的权限(-d 只看目录)
ls -ld /root /tmp
六、特殊权限:setuid / setgid / sticky
在普通 rwx 之外,Linux 还有三种特殊权限,作用于执行文件和共享目录。
6.1 setuid(Set User ID,s 位在属主)
- 含义:以文件属主的身份运行该程序,而不是以执行者的身份。
- 典型例子:
/usr/bin/passwd有 setuid,普通用户执行它时能以 root 身份修改/etc/shadow。 - 表示:属主执行位显示为
s(rwsr-xr-x);若属主无 x,显示为S(大写,表示 setuid 已设但无执行位)。 - 数字:
chmod 4755(4 代表 setuid)。
ls -l /usr/bin/passwd # 看到 rwsr-xr-x,s 就是 setuid
sudo chmod 4755 program # 给程序设置 setuid
安全提示:setuid 会让程序以属主(常为 root)身份运行,风险极高,普通用户不要随意设置。
6.2 setgid(Set Group ID,s 位在属组)
- 对文件:以文件属组身份运行。
- 对目录(更常用):目录内新建的文件会自动继承该目录的属组,而不是创建者的主组。适合团队共享目录。
- 表示:属组执行位显示为
s(rwxrwsr-x)。 - 数字:
chmod 2755(2 代表 setgid)。
sudo chmod 2755 dir # 目录设置 setgid
sudo chmod g+s dir # 符号法:属组加 s
ls -ld dir # 看到 rwxrwsr-x
6.3 sticky bit(粘滞位,t 位)
- 含义:主要作用于共享目录(如
/tmp)。设置了 sticky 的目录,只有文件属主(或 root)才能删除/重命名该目录中的文件,即使目录本身对所有人可写。 - 表示:其他用户执行位显示为
t(drwxrwxrwt);若无 x 显示T。 - 数字:
chmod 1777(1 代表 sticky);/tmp通常是 1777。
ls -ld /tmp # 看到 drwxrwxrwt,t 就是 sticky
sudo chmod 1777 shared # 共享目录设置 sticky
sudo chmod +t shared # 符号法
6.4 三种特殊权限数字对照
| 特殊权限 | 数字 | 显示位置 | 典型用途 |
|---|---|---|---|
| setuid | 4 | 属主 x 位变 s/S | 让普通用户以属主身份执行(如 passwd) |
| setgid | 2 | 属组 x 位变 s/S | 目录内新文件继承目录属组 |
| sticky | 1 | 其他 x 位变 t/T | 共享目录防止他人删除你的文件(如 /tmp) |
# 设置特殊权限的符号法
chmod u+s file # setuid
chmod g+s dir # setgid
chmod +t dir # sticky
参考:
man 1 chmod、Red Hat - 文件系统权限与特殊权限
七、ACL 权限:setfacl / getfacl(进阶)
普通权限只能对三类对象(属主/属组/其他)授权,ACL(Access Control List,访问控制列表)可以对任意多个用户/组单独授权。
需要文件系统支持 ACL(ext4/xfs 默认支持)。
ls -l第一列末尾出现+就表示该文件有 ACL。
7.1 getfacl —— 查看 ACL
getfacl file.txt # 查看文件的 ACL
输出示例:
# file: file.txt
# owner: root
# group: root
user::rw- # 属主权限
user:alice:r-x # 用户 alice 被单独授权 r-x
group::r-- # 属组权限
mask::r-x # 掩码(ACL 有效权限上限)
other::r-- # 其他权限
7.2 setfacl —— 设置 ACL
# 给指定用户授权
setfacl -m u:alice:rwx file.txt # alice 获得 rwx
# 给指定组授权
setfacl -m g:dev:r-x file.txt # dev 组获得 r-x
# 递归设置目录及其内容
setfacl -R -m u:alice:rwx dir/
# 设置默认 ACL(目录内新建文件自动继承)
setfacl -m d:u:alice:rwx dir/
# 删除某个用户/组的 ACL
setfacl -x u:alice file.txt
# 删除文件所有 ACL(回到普通权限)
setfacl -b file.txt
参数说明:-m 修改/添加,-x 删除,-R 递归,-b 清空全部,d: 表示默认 ACL。
7.3 mask(掩码)
- ACL 中的
mask表示有效权限的上限:命名用户和命名组的实际有效权限 = 其授权 与 mask 取交集。 - 想调整整体上限可
setfacl -m m::rw file.txt。
参考:
man 5 acl、man 1 setfacl、man 1 getfacl、Red Hat - 文件系统权限(含 ACL)
八、权限掩码:umask 与默认权限
8.1 什么是 umask
新建文件/目录时,系统会用一个权限掩码(umask)来扣除默认权限,从而决定新文件的实际权限。
umask # 查看当前 umask(通常是 022)
umask 002 # 临时设置 umask
8.2 默认权限与 umask 计算规则
Linux 的基础默认权限:
- 文件:默认基础权限是 666(rw-rw-rw-)。
- 目录:默认基础权限是 777(rwxrwxrwx)。
实际权限 = 基础默认权限 − umask(按位扣除):
文件: 666 − 022 = 644 (rw-r--r--)
目录: 777 − 022 = 755 (rwxr-xr-x)
umask 022 的效果:属主完整权限,组和其他去掉写权限。这是最常用的默认值。
| umask | 新文件 | 新目录 |
|---|---|---|
| 022 | 644 | 755 |
| 002 | 664 | 775 |
| 077 | 600 | 700 |
| 000 | 666 | 777 |
计算示例:umask 为 002 时,新文件 = 666 − 002 = 664(rw-rw-r--),新目录 = 777 − 002 = 775。
umask # 查看当前值
touch new.txt; ls -l new.txt # 新文件权限
mkdir newdir; ls -ld newdir # 新目录权限
注意:umask 计算是按位相减(不是算术相减)。例如 umask 033 时,文件 = 666 − 033 = 644,目录 = 777 − 033 = 744。
永久设置:把 umask 002 写入 ~/.bashrc 或 /etc/profile。
参考:
man 1 umask、Red Hat - 文件系统权限(含 umask)
九、不可变属性:chattr(深化)
除了权限,Linux 还有文件属性(attribute),由 chattr 管理。最常用的是 不可变属性(immutable)。
9.1 chattr +i(不可变)
sudo chattr +i important.txt # 给文件加上不可变属性
sudo lsattr important.txt # 查看属性(看到 ----i--------)
sudo chattr -i important.txt # 移除不可变属性
- 加了
+i后,文件不能被修改、删除、重命名,连 root 也不行(除非先去掉属性)。 - 适合保护重要配置文件或防止误删。
lsattr查看属性,chattr修改。
9.2 其他常用属性
| 属性 | 作用 |
|---|---|
+i |
immutable 不可变(防修改/删除) |
+a |
append only 只能追加(适合日志) |
+R |
目录递归(recursive) |
+e |
extent 格式(默认) |
sudo chattr +a app.log # 只能追加,不能覆盖/删除
sudo chattr -a app.log # 移除追加属性
lsattr app.log # 查看属性
chattr/lsattr需要文件系统支持(ext4、xfs 支持;某些文件系统如部分网络盘不支持)。
参考:
man 1 chattr、man 1 lsattr
十、总结与练习
10.1 核心速查
| 需求 | 命令 |
|---|---|
| 查看权限 | ls -l / stat |
| 数字改权限 | chmod 755 文件 |
| 符号改权限 | chmod u+x,g-w 文件 |
| 递归改权限 | chmod -R 755 目录 |
| 改属主 | sudo chown alice 文件 |
| 改属主+属组 | sudo chown alice:dev 文件 |
| 改属组 | chgrp dev 文件 |
| 特殊权限 | chmod 4755(setuid)/2755(setgid)/1777(sticky) |
| 查看 ACL | getfacl 文件 |
| 设置 ACL | setfacl -m u:alice:rwx 文件 |
| 查看 umask | umask |
| 不可变属性 | sudo chattr +i 文件 |
| 查看属性 | lsattr 文件 |
10.2 动手练习建议
# 1. 查看与理解权限
ls -l /etc/hosts /usr/bin/passwd
stat /etc/hosts
# 2. 修改权限
echo "test" > /tmp/p.txt
chmod 644 /tmp/p.txt; ls -l /tmp/p.txt
chmod u+x,g-w /tmp/p.txt; ls -l /tmp/p.txt
# 3. 属主与属组
sudo chown root:root /tmp/p.txt
ls -l /tmp/p.txt
# 4. 目录权限体验
mkdir -p /tmp/dirperm; chmod 000 /tmp/dirperm; ls /tmp/dirperm # 无权限
chmod 755 /tmp/dirperm; ls -ld /tmp/dirperm
# 5. 特殊权限与 umask
ls -ld /tmp; umask; touch /tmp/um.txt; ls -l /tmp/um.txt
# 6. ACL
touch /tmp/acl.txt; setfacl -m u:nobody:rw /tmp/acl.txt; getfacl /tmp/acl.txt
# 7. chattr 保护文件
echo "important" > /tmp/imp.txt; sudo chattr +i /tmp/imp.txt
rm /tmp/imp.txt # 会失败(不可变)
sudo chattr -i /tmp/imp.txt; rm /tmp/imp.txt # 先去掉属性再删
提示:练习请在虚拟机(如 Rocky Linux)中进行,避免影响真实系统。权限相关命令(chown、chattr)多数需要
sudo。
参考资料
- coreutils man 手册:
man 1 chmod、man 1 chown、man 1 chgrp、man 1 ls、man 1 stat、man 1 umask man 1 chattr、man 1 lsattrman 5 acl、man 1 setfacl、man 1 getfacl- Red Hat 官方文档 - 管理文件系统权限:https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/configuring_basic_system_settings/managing-file-system-permissions_configuring-basic-system-settings
- Rocky Linux 官方文档 - 权限管理:https://docs.rockylinux.org/books/admin_guide/14-special-authority/
- 菜鸟教程 - Linux 文件权限:https://www.runoob.com/linux/linux-file-attr-permission.html# Linux 文件管理
目录
- 前置知识:文件元数据
- 导航与查看:pwd / ls / cd
- 内容查看:cat / less / head / tail
- 文件操作:mkdir / touch / cp / mv / rm
- 通配符 * ? 的应用
- 查找与定位:find / locate / which / whereis
- 软链接 vs 硬链接:ln
- 压缩与解压:tar / gzip / zip
- 总结与练习
〇、前置知识:文件元数据
文件元数据(metadata) 是文件系统中描述文件本身属性(而非文件内容)的数据,它们存储在 inode 中,主要包含:
常见元数据字段:
- 权限(rwxr-xr-x) — 属主、属组、其他人的读/写/执行权限
- 所有者(uid/gid) — 文件的用户和组归属
- 时间戳:
- atime — 最后访问时间
- mtime — 最后修改时间(内容变更)
- ctime — 最后状态变更时间(权限/所有者/链接数等变更,非内容)
- 文件大小 — 字节数
- 链接计数 — 硬链接数量
- 文件类型 — 普通文件、目录、符号链接、设备文件等
- 扩展属性(xattrs) — 用户自定义或系统附加的键值对(如 SELinux 上下文)
查看元数据使用 stat 命令:
stat filename
也可以用 ls -l(部分信息)或 getfattr -d(查看扩展属性)。
元数据与文件内容分开存储:内容在 data blocks 中,元数据在 inode table 中。rm 删除文件时,只是释放 inode 和 data block,但在某些文件系统下可通过 debugfs 等工具恢复(前提是 inode 和数据块未被覆盖)。
[root@localhost ~]# stat a.txt
File: a.txt
Size: 2518 Blocks: 8 IO Block: 4096 regular file
Device: 253,0 Inode: 100871888 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2026-07-19 16:57:45.679395790 +0800
Modify: 2026-07-19 16:57:45.679395790 +0800
Change: 2026-07-19 16:57:45.682395782 +0800
Birth: 2026-07-19 16:57:45.679395790 +0800
stat 输出字段说明:
| 字段 | 值 | 含义 |
|---|---|---|
| File | a.txt | 文件名,存储在目录项 (dentry),不在 inode 中 |
| Size | 2518 | 文件内容 2518 字节(~2.5KB) |
| Blocks | 8 | 占用 8 个 512B 扇区 = 4096B(XFS 最小分配 4KB) |
| IO Block | 4096 | 文件系统 I/O 块大小 4KB |
| File type | regular file | 普通文件(Linux 七种文件类型之一) |
| Device | 253,0 | 主:次设备号,对应 /dev/mapper/rhel-root |
| Inode | 100871888 | 元数据索引编号,文件系统内唯一 |
| Links | 1 | 硬链接计数,=1 表示只有一个文件名指向此 inode |
| Access (权限) | 0755 | 0 (特殊) + 7 (属主) + 5 (属组) + 5 (其他人) |
| Uid | 0 → root | 文件属主(超级管理员 uid=0) |
| Gid | 0 → root | 文件属组(root 组) |
| Context | unconfined_u:... | SELinux 上下文(用户/角色/类型/级别) |
| Access (atime) | 16:57:45.679 | 最后访问时间,读取时更新(cat/vim 打开/less) |
| Modify (mtime) | 16:57:45.679 | 内容修改时间,写入时更新(echo/重定向/vim :w) |
| Change (ctime) | 16:57:45.682 | 元数据变更时间,chmod/chown/mv 时更新 |
| Birth | 16:57:45.679 | 文件创建时间,XFS 支持记录 |
补充:
-rwxr-xr-x表示普通文件,属主 rwx (7),属组 r-x (5),其他人 r-x (5)。SELinux Context 中:unconfined_u非受限用户、object_r客体角色、admin_home_t管理员家目录文件标签、s0最低敏感级别。
一、导航与查看:pwd / ls / cd
这三个命令是最基础的导航三件套:我在哪(pwd)→ 有什么(ls)→ 去哪(cd)。
1.1 pwd —— 显示当前工作目录
pwd # 打印当前所在目录的完整路径
pwd -P # 显示物理路径(如果当前目录是软链接,显示链接指向的真实路径)
pwd= Print Working Directory,打印当前工作目录。- 例如输出
/home/rocky,表示当前在 rocky 用户的主目录。
1.2 ls —— 列出目录内容
ls # 列出当前目录的文件和子目录
ls -l # 以长格式(详细)列出,显示权限、属主、大小、时间等
ls -a # 显示所有文件,包括隐藏文件(以 . 开头的文件)
ls -la # 组合:长格式 + 所有文件
ls -h # 人类可读大小(配合 -l 使用,显示 K/M/G)
ls -R # 递归列出子目录内容
ls -t # 按修改时间排序(最新的在前)
ls /etc # 列出指定目录的内容
常用组合:ls -lah(长格式、含隐藏文件、人类可读大小),这是最常用的查看方式。
1.3 看懂 ls -l 的输出
执行 ls -l 输出示例:
-rw-r--r--. 1 rocky rocky 1234 May 10 10:30 file.txt
drwxr-xr-x. 2 rocky rocky 4096 May 10 10:30 dir1
lrwxrwxrwx. 1 rocky rocky 10 May 10 10:30 link -> file.txt
每一行分为若干字段,从左到右:
| 字段 | 含义 |
|---|---|
| 第 1 个字符 | 文件类型:- 普通文件,d 目录,l 符号链接,b 块设备,c 字符设备,p 管道,s 套接字 |
| 第 2-4 位 | 属主(user) 的读/写/执行权限(rwx) |
| 第 5-7 位 | 属组(group) 的权限 |
| 第 8-10 位 | 其他用户(other) 的权限 |
| 第 2 个字段 | 硬链接数(详见第六章) |
| 第 3 个字段 | 属主(文件所有者) |
| 第 4 个字段 | 属组 |
| 第 5 个字段 | 文件大小(字节,配合 -h 显示为 K/M/G) |
| 第 6-8 个字段 | 最后修改时间 |
| 第 9 个字段 | 文件名(若是符号链接,显示 链接名 -> 目标) |
权限符号含义:
r= 读(read,4),w= 写(write,2),x= 执行(execute,1),-= 无此权限。- 例如
rwxr-xr-x:属主可读可写可执行,属组和其他用户只可读可执行。 - 数字对应关系在权限修改(
chmod 755)中常用,详见后文或后续博客。
1.4 cd —— 切换目录
cd # 回到当前用户的主目录(相当于 cd ~)
cd ~ # 回到主目录
cd /etc # 切换到绝对路径 /etc
cd .. # 返回上一级目录
cd ../.. # 返回上两级目录
cd - # 回到上一次所在的目录
cd ~other # 切换到 other 用户的主目录
相对路径 vs 绝对路径:
- 绝对路径:以
/开头,从根目录算起,如/etc/hosts。 - 相对路径:不以
/开头,从当前目录算起,如../var/log。
二、内容查看:cat / less / head / tail
查看文件内容是最常用的操作,按需选择工具:小文件用 cat,大文件用 less,看开头用 head,看结尾/实时用 tail。
2.1 cat —— 连接并打印文件内容
cat file.txt # 把整个文件内容一次性打印到屏幕
cat -n file.txt # 显示行号
cat -A file.txt # 显示所有不可见字符(如 $ 表示行尾)
cat file1 file2 # 依次打印多个文件
cat a.txt > b.txt # 重定向:把 a 的内容写入 b(覆盖)
cat a.txt >> b.txt # 追加:把 a 的内容追加到 b 末尾
cat= concatenate(连接)。注意:cat会一次性把整个文件输出,文件很大时会刷屏,此时应改用less。
2.2 less —— 分页查看(大文件首选)
less bigfile.log # 分页查看文件内容
进入 less 后的常用按键:
| 按键 | 作用 |
|---|---|
| 空格 / f | 向下翻一页 |
| b | 向上翻一页 |
| 回车 / e | 向下翻一行 |
| 上/下箭头 / k/j | 逐行移动 |
/关键词 |
向下搜索,n 跳到下一个匹配 |
?关键词 |
向上搜索 |
| g / G | 跳到文件开头 / 结尾 |
| q | 退出 less |
为什么推荐 less? 它可以前后翻页、搜索,且不会一次性把所有内容刷到屏幕,处理大文件非常高效。
more是较老的同类工具,功能不如 less。
2.3 head —— 查看文件开头
head file.txt # 默认显示前 10 行
head -n 20 file.txt # 显示前 20 行
head -5 file.txt # 显示前 5 行(-5 等价于 -n 5)
head -c 100 file.txt # 显示前 100 个字节
2.4 tail —— 查看文件结尾
tail file.txt # 默认显示最后 10 行
tail -n 20 file.txt # 显示最后 20 行
tail -f app.log # ★实时跟踪文件新增内容
tail -f -n 50 app.log # 先显示最后 50 行,再实时跟踪
tail -f 详解:
-f= follow(跟随),文件有新内容写入时会实时显示在屏幕上,非常适合查看日志。- 典型用法:
tail -f /var/log/messages或tail -f /var/log/messages(Red Hat 系系统日志)。 - 退出:按
Ctrl + C终止。 - 进阶:
tail -F(大写 F)比-f更智能,即使日志文件被轮转(rotate)/重建也能继续跟踪,生产环境更推荐。
# 实时查看 Rocky Linux 系统日志(Red Hat 系主日志文件)
sudo tail -f /var/log/messages
# 实时查看安全/登录日志
sudo tail -f /var/log/secure
三、文件操作:mkdir / touch / cp / mv / rm
3.1 mkdir —— 创建目录
mkdir newdir # 创建一个目录
mkdir -p a/b/c # ★递归创建多级目录(父目录不存在也会自动创建)
mkdir -v dir # 显示创建过程(verbose)
mkdir -m 755 dir # 创建时直接指定权限
-p是最常用的选项,例如mkdir -p /home/user/project/src一次性创建整条路径。
3.2 touch —— 创建空文件 / 更新时间戳
touch newfile.txt # 创建空文件(文件已存在则更新其时间戳)
touch -t 202401011200 file # 把时间戳设置为指定时间
touch file1 file2 file3 # 一次创建多个文件
3.3 cp —— 复制
cp source.txt dest.txt # 复制文件并重命名
cp source.txt dir/ # 复制到目录(保留原名)
cp -r srcdir destdir # ★递归复制目录
cp -i a b # 覆盖前询问确认(interactive,建议养成习惯)
cp -p a b # 保留权限、属主、时间戳(preserve)
cp -a a b # 相当于 -dpR,完整保留属性(常用于备份)
cp -v a b # 显示复制过程
3.4 mv —— 移动 / 重命名
mv old.txt new.txt # 重命名文件
mv file.txt dir/ # 移动到目录
mv -i a b # 覆盖前询问
mv -v a b # 显示过程
mv dir1 dir2 # 移动(或重命名)目录,无需 -r
mv对文件和目录都不需要-r,它本质上是"移动"(可跨文件系统时复制+删除)。
3.5 rm —— 删除(小心使用!)
rm file.txt # 删除文件
rm -r dir # ★递归删除目录(及其中的所有内容)
rm -f file # 强制删除,不询问(force)
rm -rf dir # ★★递归 + 强制删除(危险,慎用!)
rm -i *.log # 逐个询问确认后删除
rm -d dir # 删除空目录(等价于 rmdir)
安全提醒(重要):
rm -rf删除后无法恢复(不会进回收站),使用前务必三思,确认路径正确。- 经典事故:
rm -rf /(删除根目录)、rm -rf /var(删除系统数据)都会摧毁系统。 - 建议:删除重要目录前,先用
pwd和ls确认当前路径,或养成用-i询问的习惯。 rmdir只能删除空目录,非空目录用rm -r。
四、通配符 * ? 的应用
通配符(Wildcard / Globbing) 用于批量匹配文件名,由 shell 在命令执行前展开,而不是由命令本身处理。
| 通配符 | 含义 | 示例 |
|---|---|---|
* |
匹配任意多个(含 0 个)任意字符 | *.log 匹配所有以 .log 结尾的文件 |
? |
匹配恰好 1 个任意字符 | file?.txt 匹配 file1.txt、fileA.txt,不匹配 file10.txt |
[abc] |
匹配方括号中任一个字符 | file[12].txt 匹配 file1.txt、file2.txt |
[a-z] |
匹配范围内的字符 | file[0-9].txt 匹配 file0.txt~file9.txt |
[!abc] |
匹配不在方括号中的字符 | file[!1].txt 匹配不以 1 结尾的 file?.txt |
4.1 通配符应用示例
# 列出所有 .log 文件
ls *.log
# 删除所有 .log 文件(rm *.log 是典型的批量删除用法)
rm *.log
# 删除以 backup 开头的所有文件
rm backup*
# 复制所有 .txt 文件到 /tmp
cp *.txt /tmp/
# 匹配单个字符:file1.txt 或 file2.txt
ls file?.txt
# 匹配数字开头的文件
ls [0-9]*
# 移动所有以 .log 或 .txt 结尾的文件
mv *.{log,txt} /backup/
# 查看 /etc 下所有 .conf 配置文件
ls /etc/*.conf
4.2 注意事项
*不匹配以.开头的隐藏文件(除非通配符本身以.开头)。- 通配符在没有匹配时,默认保持原样传给命令(可能报错"no such file");某些 shell 可配置为报错。
rm *.log需谨慎:先ls *.log确认要删除的文件列表,再执行删除。- 注意与正则表达式区分:通配符是文件名匹配(glob),正则用于文本内容匹配(如 grep)。
五、查找与定位:find / locate / which / whereis
| 命令 | 作用 | 查找依据 | 速度 |
|---|---|---|---|
find |
在指定目录实时遍历查找,条件强大 | 按文件名、类型、时间、大小等 | 慢(实时扫描) |
locate |
从预建数据库中快速查找 | 按文件名 | 极快(但可能不是最新) |
which |
查找可执行命令的位置 | 按 PATH 环境变量 | 快 |
whereis |
查找命令的二进制、源码、man 手册 | 按固定目录 | 快 |
5.1 find —— 功能最强大的查找命令
# 按名称查找(当前目录递归)
find . -name "*.log"
find /etc -name "httpd.conf"
# 按名称查找,忽略大小写
find / -iname "readme*"
# 按类型查找(f=文件,d=目录,l=符号链接)
find /var -type f
find / -type d -name "conf"
# 按大小查找(+100M 大于,-10k 小于)
find / -size +100M
find . -size -1k
# 按时间查找(mtime=修改时间,+7 为超过 7 天)
find /var/log -mtime +7
find . -mmin -60 # 60 分钟内修改过的
# 找到后执行操作(删除、查看详情等)
find /tmp -name "*.tmp" -delete
find . -name "*.log" -exec ls -l {} \;
find /var/log -name "*.gz" -exec rm {} \;
# 按权限/属主查找
find / -user rocky
find / -perm 644
find的-exec ... {} \;语法中:{}代表找到的每个文件,\;表示命令结束。也可以加-ok在每次执行前询问。
5.2 locate —— 数据库快速查找
locate *.conf # 从数据库快速查找
locate httpd.conf
sudo updatedb # 手动更新数据库(locate 依赖它)
locate查询的是updatedb建立的文件索引数据库,速度极快。- 缺点:数据库是定期更新的,新建的文件可能查不到;查不到时先执行
sudo updatedb更新。 - Rocky Linux 中可能需先安装:
sudo dnf install mlocate。
5.3 which —— 查找命令所在路径
which ls # 输出 /usr/bin/ls
which -a python3 # 列出所有匹配的路径
which dnf curl vim # 一次查多个
which在 PATH 环境变量指定的目录中查找可执行命令,用来确认"某个命令装没装、在哪"。- 常见用途:查
which java、which python确认软件安装位置。
5.4 whereis —— 查找二进制/源码/手册
whereis ls # 输出二进制、源码、man 手册位置
whereis -b ls # 只找二进制
whereis -m ls # 只找 man 手册
whereis在固定目录(如/bin、/usr/bin、/usr/man等)中查找,能找到二进制文件、源码、帮助手册。- 它不依赖 PATH,也不做实时扫描。
选哪个?
- 按文件名全盘/大范围找文件 →
find(最可靠)或locate(最快)。 - 找某个命令装在哪 →
which(查 PATH)或whereis(含手册)。
六、软链接 vs 硬链接:ln
链接(link) 是让多个文件名指向同一个文件的机制。理解它需要先了解 inode(索引节点)。
6.1 先理解 inode 和目录项
- 每个文件在磁盘上对应一个 inode,其中保存文件的元数据(大小、权限、属主、数据块位置等)和一个 inode 编号。
- 文件名本身并不在 inode 中,而是存在**目录项(directory entry)**里,目录项把"文件名"映射到"inode 编号"。
- 访问文件的流程:文件名 → 目录项 → inode → 数据块。
一句话:ls -i 可以查看每个文件的 inode 编号,这是理解链接的关键。
ls -i file.txt # 查看文件的 inode 编号
6.2 硬链接(Hard Link)
ln target.txt hardlink.txt # 为 target.txt 创建硬链接 hardlink.txt
硬链接的本质:在目录中新增一个目录项,让这个新文件名也指向同一个 inode。
硬链接的特点:
- 硬链接与原始文件共享同一个 inode,
ls -i编号相同,内容完全一致。 - 删除任意一个文件名,数据不会被删除,只要还有至少一个硬链接存在,数据就还在。
- 修改任意一个链接的内容,其他链接都会同步变化(因为是同一份数据)。
- 硬链接数记录在 inode 中,就是
ls -l第 2 个字段的数字。
硬链接的限制(重要):
- 不能对目录创建硬链接(避免形成循环,只有系统可以创建 . 和 ..)。
- 不能跨文件系统创建硬链接(不同文件系统有各自独立的 inode 表)。
- 通常也不建议对特殊文件(设备等)创建硬链接。
6.3 软链接 / 符号链接(Symbolic Link)
ln -s target.txt symlink.txt # 创建软链接 symlink.txt → target.txt
软链接的本质:它本身是一个独立的文件(有自己的 inode),文件内容存的是目标文件的路径字符串。它就像 Windows 里的"快捷方式"。
软链接的特点:
- 软链接有自己独立的 inode,
ls -i与目标不同。 ls -l中软链接显示为l开头,并显示链接名 -> 目标。- 若目标被删除,软链接就变成失效的(broken),指向一个不存在的路径。
- 可以跨文件系统创建,可以链接目录。
- 软链接内容只是一个路径字符串,所以目标移动位置后软链接会失效。
6.4 两者对比表
| 对比项 | 硬链接 | 软链接(符号链接) |
|---|---|---|
| 是否独立 inode | 否,与目标共享 | 是,有独立 inode |
| 内容本质 | 同一份数据 | 存目标路径字符串 |
| 目标删除后 | 数据仍在(有其他链接) | 链接失效(broken) |
| 能否链接目录 | 不能 | 可以 |
| 能否跨文件系统 | 不能 | 可以 |
| ls -l 显示 | 普通文件类型(-) | 类型为 l,显示 -> 目标 |
| 直观理解 | 同一个文件的另一个"门牌号" | 指向目标的"快捷方式" |
| 创建命令 | ln 源 目标 |
ln -s 源 目标 |
6.5 验证与常见用法
echo hello > file.txt
ln file.txt hard.txt # 硬链接
ln -s file.txt soft.txt # 软链接
ls -li # -i 显示 inode 编号
# 输出中 file.txt 和 hard.txt 的 inode 编号相同,soft.txt 不同
# 删除原文件验证区别
rm file.txt
cat hard.txt # 仍能读到 hello(硬链接,数据还在)
cat soft.txt # 报错 No such file(软链接失效)
实际使用建议:
- 软链接
ln -s使用更普遍(可链接目录、跨文件系统、直观)。常见如/usr/bin/python -> python3、/etc/localtime -> /usr/share/zoneinfo/...。 - 硬链接适合对同一文件系统内的大文件做"备份"式引用,节省空间(不重复存数据)。
七、压缩与解压:tar / gzip / zip
7.1 打包 vs 压缩
- 打包(archive):把多个文件/目录合并成一个文件,不减少体积。代表工具:
tar(默认只打包不压缩)。 - 压缩(compress):通过算法减少文件体积。代表工具:
gzip、bzip2、xz。 - 实际场景:通常先用
tar打包,再用gzip等压缩。tar提供了一步完成的-z(gzip)、-j(bzip2)、-J(xz)选项。
一句话:tar 负责"合在一起",gzip 负责"变小"。而 zip 是打包和压缩一步到位的格式。
7.2 tar —— 打包/归档
# 创建(打包)一个 tar 包
tar -cvf backup.tar /etc # c=create v=verbose f=文件
# 打包并压缩为 .tar.gz(最常用)
tar -czvf backup.tar.gz /etc
# 解包 / 解压
tar -xvf backup.tar # 解包
tar -xzvf backup.tar.gz # 解压 .tar.gz
tar -xjvf backup.tar.bz2 # 解压 .tar.bz2
tar -xJvf backup.tar.xz # 解压 .tar.xz
# 查看包内容(不解开)
tar -tvf backup.tar.gz
# 解压到指定目录
tar -xzvf backup.tar.gz -C /tmp/
# 追加文件到包
tar -rvf backup.tar newfile
tar 常用选项:
| 选项 | 含义 |
|---|---|
-c |
创建(create)打包 |
-x |
解包(extract) |
-t |
列出包内容(test) |
-v |
显示详细过程(verbose) |
-f |
指定文件名(必须紧跟文件名) |
-z |
通过 gzip 压缩/解压(.tar.gz) |
-j |
通过 bzip2 压缩/解压(.tar.bz2) |
-J |
通过 xz 压缩/解压(.tar.xz) |
-C |
解压到指定目录 |
-p |
保留权限属性 |
记忆技巧:
tar -czvf 打包名 源创建,tar -xzvf 打包名解压。Rocky Linux 中.tar.gz是最常见的格式。
7.3 gzip / gunzip —— 单文件压缩
gzip file.txt # 压缩,生成 file.txt.gz,原文件被替换/删除
gzip -k file.txt # 压缩但保留原文件
gunzip file.txt.gz # 解压,恢复 file.txt
gzip -d file.txt.gz # 等价于 gunzip
gzip -l file.txt.gz # 查看压缩信息
gzip只能压缩单个文件(不能直接压缩目录),压缩后文件名加.gz后缀。- 要压缩目录,通常先
tar打包再用 gzip(或直接用tar -z)。 - 查看压缩的文本文件可直接用
zcat file.gz、zless、zgrep。
7.4 zip / unzip —— 一步到位的压缩格式
# 压缩(打包+压缩一步完成)
zip archive.zip file1 file2 dir
zip -r archive.zip dir/ # 递归压缩目录
zip -P pass archive.zip f # 加密压缩
# 解压
unzip archive.zip
unzip archive.zip -d /tmp/ # 解压到指定目录
unzip -l archive.zip # 查看内容不解压
zip是打包和压缩一体的格式,与 Windows 的 .zip 兼容,适合跨平台传输。- Rocky Linux 可能需安装:
sudo dnf install zip unzip。
7.5 三种方式对比
| 方式 | 是否压缩 | 适用场景 | 常见后缀 |
|---|---|---|---|
tar(不带 -z) |
只打包不压缩 | 归档、组合多个文件 | .tar |
tar -z |
打包+gzip 压缩 | Linux 中最常用的分发格式 | .tar.gz / .tgz |
gzip |
只压缩单个文件 | 压缩单个日志/文件 | .gz |
zip |
打包+压缩 | 跨平台、与 Windows 兼容 | .zip |
压缩率参考(粗略):gzip 较快、体积中等;bzip2 更小但慢;xz 压缩率最高但最慢。Red Hat 系软件包
.rpm、源码包.tar.xz很常见。
7.6 实战:打包压缩与解压日志
# 把 /var/log 下旧的 .log 日志打包压缩
cd /var/log
sudo tar -czvf logs-backup.tar.gz *.log
# 解压到 /tmp 目录查看
mkdir -p /tmp/restore
sudo tar -xzvf logs-backup.tar.gz -C /tmp/restore/
# 查看包内文件列表
tar -tvf logs-backup.tar.gz
八、总结与练习
8.1 核心速查
| 需求 | 命令 |
|---|---|
| 我在哪 | pwd |
| 看什么 | ls -lah |
| 去哪 | cd |
| 看小文件 | cat |
| 看大文件 | less |
| 看开头 | head |
| 看结尾/实时 | tail -f |
| 建目录 | mkdir -p |
| 建空文件 | touch |
| 复制 | cp -r(目录) |
| 移动/重命名 | mv |
| 删除 | rm -rf(慎用) |
| 找文件 | find / locate |
| 找命令 | which / whereis |
| 建软链接 | ln -s |
| 打包压缩 | tar -czvf / tar -xzvf |
8.2 动手练习建议
# 1. 创建练习目录结构
mkdir -p ~/practice/{docs,logs,backup}
# 2. 创建一些文件和日志
touch ~/practice/docs/{a.txt,b.txt,readme.md}
echo "hello" > ~/practice/logs/app.log
# 3. 练习查看
cd ~/practice
ls -lah
head -3 /etc/passwd
tail -f ~/practice/logs/app.log # 另开终端 echo 追加内容观察实时输出
# 4. 练习通配符
rm ~/practice/docs/*.txt
# 5. 练习查找
find ~/practice -name "*.md"
# 6. 练习软链接
ln -s ~/practice/logs/app.log ~/practice/backup/app-link
ls -l ~/practice/backup/
# 7. 练习打包压缩
tar -czvf ~/practice/backup/practice.tar.gz ~/practice/docs
tar -tvf ~/practice/backup/practice.tar.gz
参考资料
- GNU Coreutils 官方文档(ls、cp、mv、rm、ln 等):https://www.gnu.org/software/coreutils/manual/
- GNU Tar 官方手册:https://www.gnu.org/software/tar/manual/
- man 手册(Rocky Linux 内运行
man ls、man find、man tar等) - Rocky Linux 官方文档 - 文件系统:https://docs.rockylinux.org/books/admin_guide/07-file-systems/
- 菜鸟教程 - Linux 命令大全:https://www.runoob.com/linux/linux-command-manual.html
- 菜鸟教程 - Linux 文件与目录管理:https://www.runoob.com/linux/linux-file-content-manage.html
