Linux文件系统基础概念
Linux文件系统基础概念
一、文件的概念
在Linux系统语境下,文件(file)一般有两个基本含义:
狭义:指普通的文本文件,或二进制文件。包括日常所见的源代码、word文档、压缩包、图片、视频文件等等。
广义:除了狭义上的文件外,几乎所有可操作的设备或接口都可视为文件。包括键盘、鼠标、硬盘、串口、触摸屏、显示器等,也包括网络通讯端口、进程间通讯管道等抽象概念。
二、Linux系统中文件的分类
在Linux中,文件总共被分成了7种,他们分别是:
- 普通文件:存在于外部存储器中,用于存储普通数据(包括音频、视频、图像...)
- 目录文件:用于存放目录项,是文件系统管理的重要文件类型
- 管道文件:一种用于进程间通信的特殊文件,也称为命名管道FIFO
- 套接字文件:一种用于网络间通信的特殊文件
- 链接文件:用于间接访问另外一个目标文件,相当于Windows快捷方式
- 字符设备文件:字符设备在应用层的访问接口
- 块设备文件:块设备在应用层的访问接口
gec@ubuntu:~$ ls -l
-rw-r--r-- 1 gec gec 345 Sep 12:38 a.zip
drwxr-xr-x 2 gec gec 1024 Sep 12:38 dir/
prw-r--r-- 1 gec gec 0 Sep 12:38 pipe
srw-r--r-- 1 gec gec 0 Sep 12:38 socket
lrw-r--r-- 1 gec gec 4 Sep 12:38 link -> a.zip
crw-r--r-- 1 gec gec 1, 3 Sep 12:38 character
brw-r--r-- 1 gec gec 5, 1 Sep 12:38 block
注意到,每个文件信息的最左边一栏,是各种文件类型的缩写,从上到下依次是:
-(regular)普通文件d(directory)目录文件p(pipe)管道文件(命名管道)s(socket)套接字文件(Unix域/本地域套接字)l(link)链接文件(软链接)c(character)字符设备文件b(block)块设备文件
三、系统IO与标准IO
对文件的操作,基本上就是输入输出,因此也一般称为IO接口。在操作系统的层面上,这一组专门针对文件的IO接口就被称为系统IO;在标准库的层面上,这一组专门针对文件的IO接口就被称为标准IO,如下图所示:
- 系统IO:是众多系统调用当中专用于文件操作的一部分接口。
- 标准IO:是众多标准函数当中专用于文件操作的一部分接口。
从图中还能看到,标准IO实际上是对系统IO的封装,系统IO是更接近底层的接口。如果把系统IO比喻为菜市场,提供各式肉蛋菜果蔬,那么标准IO就是对这些基本原来的进一步封装,是品类和功能更加丰富的各类酒庄饭店。
如何选择系统IO与标准IO
-
系统IO
- 由操作系统直接提供的函数接口,特点是简洁,功能单一
- 没有提供缓冲区,因此对海量数据的操作效率较低
- 套接字Socket、设备文件的访问只能使用系统IO
-
标准IO
- 由标准C库提供的函数接口,特点是功能丰富
- 有提供缓冲区,因此对海量数据的操作效率高
- 编程开发中尽量选择标准IO,但许多场合只能用系统IO
总的来讲,这两组函数接口在实际编程开发中都经常会用到,都是基本开发技能。
四、文件权限详解
在Linux中,文件权限通过9个字符表示,分为三组:
-rwxr-xr--
↑↑↑↑↑↑↑↑↑
││││││││└── 其他用户读权限
│││││││└─── 其他用户写权限
││││││└──── 其他用户执行权限
│││││└───── 所属组读权限
││││└────── 所属组写权限
│││└─────── 所属组执行权限
││└──────── 所有者读权限
│└───────── 所有者写权限
└────────── 所有者执行权限
常用文件操作命令
# 查看文件类型
file filename
# 查看文件详细信息
ls -l filename
# 改变文件权限
chmod 755 filename
# 改变文件所有者
chown user:group filename
# 创建链接
ln -s target link_name # 软链接
ln target link_name # 硬链接
五、Linux 文件操作基本命令速查表
1. 文件查看
| 场景 | 命令 |
|---|---|
| 一次性查看全部内容 | cat file |
| 带行号查看 | cat -n file |
| 分页上下滚动 | less file |
| 仅向下翻页 | more file |
| 看前 20 行 | head -n 20 file |
| 看后 20 行 | tail -n 20 file |
| 实时刷新日志 | tail -f file |
2. 文件/目录创建
| 场景 | 命令 |
|---|---|
| 创建空文件 | touch file |
| 一次性建多级目录 | mkdir -p a/b/c |
| 创建并赋权 755 | mkdir -m 755 dir |
3. 文件编辑
| 场景 | 命令 |
|---|---|
| 新手友好编辑 | nano file |
| 高级编辑 | vim file |
4. 复制、移动、删除
| 场景 | 命令 |
|---|---|
| 复制文件 | cp src dst |
| 复制目录 | cp -r src_dir dst_dir |
| 移动/重命名 | mv old new |
| 强制删除文件 | rm -f file |
| 递归删目录 | rm -r dir |
| 交互式删除 | rm -i file |
| 仅删空目录 | rmdir dir |
5. 查找与搜索
| 场景 | 命令 |
|---|---|
| 按名称找文件 | find /path -name "*.txt" |
| 按类型找目录 | find /path -type d -name "cache" |
| 大于 100 MB 的文件 | find /path -size +100M |
| 7 天内修改的文件 | find /path -mtime -7 |
| 文件内关键词搜索 | grep "keyword" file |
| 忽略大小写搜索 | grep -i "key" file |
| 反向匹配 | grep -v "key" file |
| 递归目录搜索 | grep -r "key" /path |
6. 权限与归属
| 场景 | 命令 |
|---|---|
| 数字赋权 | chmod 644 file |
| 给所有人加执行 | chmod a+x script.sh |
| 递归改权限 | chmod -R 755 dir |
| 改所有者 | chown user:group file |
| 递归改归属 | chown -R user:group dir |
7. 信息查看
| 场景 | 命令 |
|---|---|
| 详细列表 | ls -l |
| 含隐藏文件 | ls -a |
| 人类可读大小 | ls -lh |
| 按时间排序 | ls -lt |
| 查看文件类型 | file file |
| 查看详细属性 | stat file |
8. 差异比较
| 场景 | 命令 |
|---|---|
| 文本差异 | diff -u file1 file2 |
| 并排对比 | diff -y file1 file2 |
| 二进制差异 | cmp file1 file2 |
9. 压缩/解压
| 场景 | 命令 |
|---|---|
| 打包不压缩 | tar -cvf archive.tar dir/ |
| 打包+gzip | tar -czvf archive.tar.gz dir/ |
| 解压 tar.gz | tar -xzvf archive.tar.gz |
| 仅 gzip 单文件 | gzip file |
| 解压 gz | gunzip file.gz |
10. 传输与同步
| 场景 | 命令 |
|---|---|
| 复制到远程 | scp file user@host:/remote/path |
| 远程复制到本地 | scp user@host:/remote/file . |
| 目录同步(本地) | rsync -av src/ dst/ |
| 同步到远程 | rsync -av local_dir/ user@host:remote_dir/ |
11. 实用技巧
| 场景 | 命令 |
|---|---|
| 当前目录大小排行 | du -h --max-depth=1 | sort -hr |
| 找大于 100 M 的文件 | find /path -size +100M -exec ls -lh {} \; |
| GBK 转 UTF-8 | iconv -f GBK -t UTF-8 in.txt -o out.txt |
| 按 100 MB 分割 | split -b 100M bigfile part_ |
| 合并分割文件 | cat part_* >bigfile |
| 去重排序 | sort file | uniq > new_file |
| 统计重复行 | sort file | uniq -c |

浙公网安备 33010602011771号