Linux文件基本属性

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 个字符 文件类型 -dl
第 2~10 个字符 权限(9 个字符,分 3 组) rw-r--r--drwxr-xr-x
数字 链接数(硬链接数或目录的子项数) 12
第一个名字 所有者(属主) zhangsan
第二个名字 所属组(属组) zhangsan
数字 大小(字节) 12040968
日期时间 最后修改时间 Feb 25 10:00
最后 文件名(符号链接会多一个 -> 目标 myfile.txtmydirlinkfile -> 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 = 7
  • rw- = 4+2 = 6
  • r-x = 4+1 = 5
  • r-- = 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,如 27552777
  • 对可执行文件:执行时有效组为文件属组。
  • 对目录:在该目录下新建的文件/子目录,会自动继承该目录的属组(便于协作目录)。

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 -lls -ld 目录
看内容类型 file 文件名
看 inode、链接数 ls -li
看三个时间 stat 文件名
改权限(数字) chmod 644 文件chmod 755 脚本
改权限(符号) chmod u+x 文件chmod g-w 文件
改属主/属组 sudo chown 用户:组 文件
改属组 sudo chgrp 组 文件chown :组 文件
看当前用户/组 whoamiidgroups
按时间排序 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 列 chgrpchown :组
大小 ls -l 第 5 列、目录用 du -sh 随内容变化
时间 ls -l 默认 mtime;完整用 stat 随访问/修改/状态改变自动更新

建议在终端里多敲 ls -lls -ldstatchmodchown 几条命令,对照本文逐项理解,再结合 Linux简介.mdLinux系统目录结构.md 一起看,会对“文件在哪儿、归谁管、谁能动”有更清晰的认识。


文档以常见 Linux 发行版为准;部分细节(如 atime 是否更新)与挂载选项、文件系统类型有关。

发表评论