Linux 文件基本属性详解(新手详细版)
本文档面向零基础新手,从“怎么看出一个文件有什么属性”讲起,详细说明类型、权限、所有者、时间戳等,并配有大量示例和练习。
一、什么是“文件基本属性”?
在 Linux 里,每个文件或目录都带有一些“属性”,用来表示:
- 它是什么类型(普通文件、目录、链接、设备等)
- 谁可以读、写、执行(权限)
- 属于哪个用户、哪个组(所有者与属组)
- 什么时候被改过、访问过(时间戳)
- 大小、占多少块等
这些信息不需要“打开”文件就能看到,是系统管理、排错和安全的基础。下面我们逐个讲。
二、如何查看文件属性?
2.1 最常用:ls -l(长格式列表)
在终端输入:
ls -l
会看到一行一行的列表,每一行对应一个文件或目录。例如:
-rw-r--r-- 1 zhangsan zhangsan 120 Feb 25 10:00 myfile.txt
drwxr-xr-x 2 zhangsan zhangsan 4096 Feb 25 09:30 mydir
lrwxrwxrwx 1 zhangsan zhangsan 8 Feb 25 09:45 linkfile -> myfile.txt
这一行可以拆成几段来理解(从左到右):
| 一段 | 含义 | 上面例子里的对应部分 |
|---|---|---|
| 第 1 个字符 | 文件类型 | -、d、l 等 |
| 第 2~10 个字符 | 权限(9 个字符,分 3 组) | rw-r--r--、drwxr-xr-x 等 |
| 数字 | 链接数(硬链接数或目录的子项数) | 1、2 |
| 第一个名字 | 所有者(属主) | zhangsan |
| 第二个名字 | 所属组(属组) | zhangsan |
| 数字 | 大小(字节) | 120、4096、8 |
| 日期时间 | 最后修改时间 | Feb 25 10:00 |
| 最后 | 文件名(符号链接会多一个 -> 目标) |
myfile.txt、mydir、linkfile -> myfile.txt |
下面我们分别细讲:类型、权限、所有者与属组、时间与大小。
三、文件类型(第一个字符)
ls -l 每一行的第一个字符表示“这是什么类型”:
| 字符 | 类型 | 说明 |
|---|---|---|
- |
普通文件 | 文本、图片、可执行程序、压缩包等 |
d |
目录 | 文件夹 |
l |
符号链接 | 类似“快捷方式”,指向另一个路径 |
c |
字符设备 | 如终端、键盘(按字符读写) |
b |
块设备 | 如硬盘、U 盘(按块读写) |
p |
管道文件 | 进程间通信 |
s |
套接字文件 | 网络/本地套接字 |
新手最常遇到的是:-(普通文件)、d(目录)、l(符号链接)。
3.1 示例:区分类型
# 创建用于演示的文件和目录
touch normal.txt
mkdir mydir
ln -s normal.txt symlink.txt
# 长格式查看,看每行第一个字符
ls -l normal.txt mydir symlink.txt
可能的输出:
-rw-r--r-- 1 user user 0 Feb 25 10:00 normal.txt
drwxr-xr-x 2 user user 4096 Feb 25 10:00 mydir
lrwxrwxrwx 1 user user 11 Feb 25 10:00 symlink.txt -> normal.txt
normal.txt第一个字符是-→ 普通文件mydir第一个字符是d→ 目录symlink.txt第一个字符是l,且后面有-> normal.txt→ 符号链接,指向normal.txt
3.2 用 file 命令看“内容类型”
“第一个字符”表示的是在系统里的类型;file 会根据内容猜“是什么”:
file normal.txt
# 输出:normal.txt: empty(空文件)
file /bin/ls
# 输出:/bin/ls: ELF 64-bit LSB executable(可执行程序)
file /dev/sda
# 输出:/dev/sda: block special(块设备)
四、权限(第 2~10 个字符:rwxrwxrwx)
4.1 为什么是 9 个字符?
权限分三组,每组 3 个位置,对应三种权限:
rwx rwx rwx
│ │ │
│ │ └── 其他人(others):不是属主、也不在属组里的用户
│ └─────── 属组(group):文件所属用户组的成员
└──────────── 属主(owner):文件所有者
每个位置要么是字母,要么是 -:
| 字母 | 含义 | 对文件的作用 | 对目录的作用 |
|---|---|---|---|
r |
读(read) | 可以读文件内容 | 可以列出目录里的文件名 |
w |
写(write) | 可以改、删文件内容 | 可以在目录里增删改文件 |
x |
执行(execute) | 可以当作程序运行 | 可以“进入”该目录(cd)、用该目录做路径 |
- |
无 | 没有对应权限 | 没有对应权限 |
重要:对目录来说,“能进入”必须要有 x;没有 x,即使有 r 也列不全、用起来会报错。
4.2 常见权限串举例
| 权限串 | 含义(属主-属组-其他人) |
|---|---|
rwxr-xr-x |
属主可读可写可执行,属组和其他人可读可执行 |
rw-r--r-- |
属主可读可写,属组和其他人只读 |
rw------- |
只有属主可读可写,属组和其他人无权限 |
rwxrwxrwx |
所有人可读可写可执行(慎用) |
drwxr-xr-x |
目录,属主可进可改,属组和其他人可进可读 |
4.3 示例:读权限
echo "秘密内容" > secret.txt
chmod 600 secret.txt
ls -l secret.txt
# -rw------- 1 user user ... secret.txt
# 当前用户可读
cat secret.txt
# 输出:秘密内容
# 若用另一用户且该用户不在属组,则 cat secret.txt 会报 Permission denied
4.4 示例:目录的 x 权限
mkdir testdir
touch testdir/a.txt
chmod 000 testdir # 所有人无任何权限
# 当前用户(属主)也会被拒绝
ls testdir
# ls: cannot open directory 'testdir': Permission denied
cd testdir
# bash: cd: testdir: Permission denied
chmod 700 testdir # 恢复属主 rwx
ls testdir
# a.txt
五、用数字表示权限(chmod 数字法)
把 r、w、x 分别对应一个数,每组把有权限的加起来:
- r = 4
- w = 2
- x = 1
- 无 = 0
所以:
rwx= 4+2+1 = 7rw-= 4+2 = 6r-x= 4+1 = 5r--= 4---= 0
三个数字依次是:属主、属组、其他人。
| 数字 | 含义 | 等价于 |
|---|---|---|
| 777 | 所有人 rwx | rwxrwxrwx |
| 755 | 属主 rwx,属组和其他人 r-x | rwxr-xr-x |
| 644 | 属主 rw-,属组和其他人 r– | rw-r--r-- |
| 600 | 仅属主 rw- | rw------- |
| 700 | 仅属主 rwx | rwx------ |
5.1 修改权限:chmod
# 数字方式
chmod 644 myfile.txt # 属主读写,其他人只读
chmod 755 script.sh # 属主全权限,其他人读+执行(常见于可执行脚本)
chmod 700 mydir # 仅属主可进、可改目录
# 查看结果
ls -l myfile.txt script.sh
ls -ld mydir # 目录时用 -ld 看目录本身,而不是目录里的内容
5.2 符号方式:u/g/o/a 和 +/-
- u = 属主,g = 属组,o = 其他人,a = 全部
- + = 增加权限,– = 去掉权限,= = 设为指定权限
chmod u+x script.sh # 给属主增加执行权限
chmod g-w myfile.txt # 去掉属组的写权限
chmod o=--- myfile.txt # 其他人无任何权限
chmod a+r myfile.txt # 所有人增加读权限
六、所有者与所属组
6.1 属主(owner)和属组(group)
- 属主:文件“属于”哪个用户,只有该用户或 root 能改属主。
- 属组:文件属于哪个用户组,用于把权限批量给一组用户。
ls -l 里第 3、4 列就是属主和属组,例如:
-rw-r--r-- 1 zhangsan devteam 120 Feb 25 10:00 myfile.txt
↑ ↑
属主 属组
6.2 修改属主:chown
只有 root 或具备能力的用户能改属主(常用 sudo):
# 语法:chown 新属主 文件
sudo chown root myfile.txt
ls -l myfile.txt
# -rw-r--r-- 1 root devteam ... myfile.txt
# 同时改属主和属组: chown 属主:属组 文件
sudo chown zhangsan:devteam myfile.txt
6.3 修改属组:chgrp
# 语法:chgrp 新属组 文件
sudo chgrp devteam myfile.txt
# 或:chown :devteam myfile.txt(只改属组)
6.4 查看当前用户与所属组
whoami # 当前用户名
id # 当前用户 uid、gid 及所属组列表
groups # 当前用户属于哪些组
七、链接数(硬链接数)
ls -l 里权限后面的那个数字:
- 普通文件:表示有多少个硬链接指向同一个数据;新建文件一般为 1。
- 目录:至少为 2(
.和..两个目录项),子目录越多会更大。
echo "hello" > a.txt
ln a.txt b.txt # 创建硬链接
ls -l a.txt b.txt
# 两个文件的“链接数”都是 2,且 inode 相同(见下节)
八、inode 与文件大小
8.1 用 ls -i 看 inode 号
每个文件在分区里有一个唯一编号叫 inode。硬链接共享同一个 inode。
ls -i a.txt b.txt
# 若 a.txt 和 b.txt 是硬链接,两个 inode 相同
8.2 大小
- 普通文件:
ls -l里的数字是字节。 - 目录:显示的是目录本身占的块(如 4096 字节),不是目录里所有文件的总和。
- 符号链接:显示的是“目标路径”的字符串长度。
查看目录及子目录总占用用 du:
du -sh mydir
# 输出例如:12M mydir
九、时间戳(修改、访问、状态改变)
文件有三种时间(可用 stat 查看):
| 名称 | 含义 | 典型触发 |
|---|---|---|
| Modify(mtime) | 内容最后修改时间 | 写入、截断文件 |
| Access(atime) | 最后访问时间 | 读文件(部分文件系统可关 atime) |
| Change(ctime) | 状态最后改变时间 | 改权限、属主、属组、硬链接数等 |
ls -l 默认显示的是 mtime。
9.1 查看完整属性与三个时间:stat
stat myfile.txt
示例输出(格式因系统略有差异):
File: myfile.txt
Size: 120 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 123456 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/zhangsan) Gid: ( 1000/zhangsan)
Access: 2025-02-25 09:00:00.000000000 +0800
Modify: 2025-02-25 10:00:00.000000000 +0800
Change: 2025-02-25 10:00:00.000000000 +0800
9.2 按时间排序、按时间查找
# 按修改时间排序,新的在前
ls -lt
# 按修改时间倒序,旧的在前
ls -ltr
# 查找当前目录下 7 天内修改过的文件
find . -mtime -7 -type f
十、特殊权限位:setuid、setgid、sticky
在原来的 9 位权限之外,还有 3 个“特殊位”,用在可执行文件或目录上,出现在数字权限的第四位或符号权限里。
10.1 setuid(仅对可执行文件有意义)
- 数字:在属主权限前加 4,如 4755。
- 效果:执行该程序时,进程的“有效用户”变成文件属主,而不是执行者。
- 典型用途:
/usr/bin/passwd需要改/etc/shadow,普通用户没权限,通过 setuid 以 root 身份执行改密码那部分逻辑。
# 查看 passwd 命令的权限(有 s 表示 setuid)
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ... /usr/bin/passwd
# ^
# 属主执行位变成 s
10.2 setgid(可执行文件或目录)
- 数字:在属组权限前加 2,如 2755 或 2777。
- 对可执行文件:执行时有效组为文件属组。
- 对目录:在该目录下新建的文件/子目录,会自动继承该目录的属组(便于协作目录)。
10.3 sticky(一般只用于目录)
- 数字:在其他人权限前加 1,如 1777。
- 效果:目录人人可写,但只有文件属主或 root 能删/改名该目录下的文件。
- 典型用途:
/tmp,人人都能创建文件,但只能删自己的。
ls -ld /tmp
# drwxrwxrwt ... /tmp
# ^
# 其他人执行位变成 t(sticky)
新手阶段以理解为主,不必自己随便给文件加 setuid/setgid,以免带来安全风险。
十一、符号链接与硬链接(简要)
11.1 符号链接(软链接)
- 是一个单独的小文件,内容是一条路径,类型是
l。 - 删掉链接不影响目标;删掉目标后,链接会“断”(变成悬空链接)。
- 可以跨分区、指向目录。
ln -s /path/to/target linkname
ls -l linkname
# lrwxrwxrwx 1 user user ... linkname -> /path/to/target
11.2 硬链接
- 多个文件名指向同一份数据(同一 inode),不能对目录做硬链接,不能跨分区。
- 删除其中一个名字,只要链接数还大于 0,数据就还在。
ln target.txt hardlink.txt
ls -li target.txt hardlink.txt
# 两个 inode 相同,链接数为 2
十二、一条命令串起多数属性:ls -l 再复习
ls -l myfile.txt
示例输出:
-rw-r--r-- 1 zhangsan zhangsan 120 Feb 25 10:00 myfile.txt
││││││││││ │ │ │ │ │
│└┴┴┴┴┴┴┴┴ └─ 链接数 属主 属组 大小 修改时间 文件名
└─ 类型+权限(9位)
- 类型:
-普通文件,d目录,l符号链接等。 - 权限:
rw-r--r--= 属主读写,属组和其他人只读。 - 链接数:1 表示只有一个(硬)链接。
- 属主/属组:zhangsan / zhangsan。
- 大小:120 字节。
- 时间:默认是 mtime。
十三、常用操作速查
| 需求 | 命令示例 |
|---|---|
| 看类型和权限 | ls -l、ls -ld 目录 |
| 看内容类型 | file 文件名 |
| 看 inode、链接数 | ls -li |
| 看三个时间 | stat 文件名 |
| 改权限(数字) | chmod 644 文件、chmod 755 脚本 |
| 改权限(符号) | chmod u+x 文件、chmod g-w 文件 |
| 改属主/属组 | sudo chown 用户:组 文件 |
| 改属组 | sudo chgrp 组 文件 或 chown :组 文件 |
| 看当前用户/组 | whoami、id、groups |
| 按时间排序 | ls -lt(新在前)、ls -ltr(旧在前) |
十四、小结表
| 属性 | 在哪里看 | 怎么改(常见) |
|---|---|---|
| 类型 | ls -l 首字符、file |
由创建方式决定(touch/mkdir/ln 等) |
| 权限 | ls -l 的 rwx 九位 |
chmod(数字或 u/g/o +/-) |
| 属主 | ls -l 第 3 列 |
chown(需 root/sudo) |
| 属组 | ls -l 第 4 列 |
chgrp 或 chown :组 |
| 大小 | ls -l 第 5 列、目录用 du -sh |
随内容变化 |
| 时间 | ls -l 默认 mtime;完整用 stat |
随访问/修改/状态改变自动更新 |
建议在终端里多敲 ls -l、ls -ld、stat、chmod、chown 几条命令,对照本文逐项理解,再结合 Linux简介.md 和 Linux系统目录结构.md 一起看,会对“文件在哪儿、归谁管、谁能动”有更清晰的认识。
文档以常见 Linux 发行版为准;部分细节(如 atime 是否更新)与挂载选项、文件系统类型有关。