340 lines
7.1 KiB
Markdown
340 lines
7.1 KiB
Markdown
## 1、文件管理概览
|
||
|
||
Linux 文件管理主要围绕以下几个方面展开:
|
||
|
||
- 目录结构与路径
|
||
- 文件类型与 inode
|
||
- 常见目录和文件操作命令
|
||
- 文件状态与时间戳
|
||
- 通配符与链接文件
|
||
|
||
这些内容是后续学习权限、查找、文本处理、磁盘管理的基础。
|
||
|
||
**补充一点:** 每打开一个文件,进程通常都会占用一个文件描述符(fd)。
|
||
|
||
## 2、Linux 目录结构
|
||
|
||
Linux 文件系统采用**单根倒置树状结构**,一切都从根目录 `/` 开始。
|
||
|
||
- 单个文件名通常最长 255 字节
|
||
- 整个路径通常最长 4096 字节左右(不同系统实现可能略有差异)
|
||
|
||
### 2.1 绝对路径与相对路径
|
||
|
||
#### 绝对路径
|
||
|
||
从根目录 `/` 开始写起的完整路径,例如:
|
||
|
||
```shell
|
||
/etc/passwd
|
||
```
|
||
|
||
#### 相对路径
|
||
|
||
相对于当前工作目录的位置,例如:
|
||
|
||
```shell
|
||
../logs/app.log
|
||
```
|
||
|
||
### 2.2 常见目录说明
|
||
|
||
- `/`:根目录
|
||
- `/boot`:引导文件、内核、引导加载器相关文件
|
||
- `/bin`:基本用户命令
|
||
- `/sbin`:基本系统管理命令
|
||
- `/lib`:基础共享库和内核模块
|
||
- `/lib64`:64 位系统库文件目录
|
||
- `/etc`:系统配置文件
|
||
- `/home/USERNAME`:普通用户家目录
|
||
- `/root`:root 用户家目录
|
||
- `/media`:可移动设备挂载点
|
||
- `/mnt`:临时挂载点
|
||
- `/dev`:设备文件目录
|
||
- `/opt`:第三方软件安装目录
|
||
- `/srv`:服务相关数据
|
||
- `/tmp`:临时文件目录
|
||
- `/usr`:共享只读程序和数据
|
||
- `/usr/bin`:大量用户命令
|
||
- `/usr/lib`:库文件
|
||
- `/usr/include`:C 头文件
|
||
- `/usr/share`:共享数据
|
||
- `/usr/local`:本地手工安装软件目录
|
||
- `/var`:经常变化的数据
|
||
- `/var/cache`:缓存数据
|
||
- `/var/lib`:应用状态数据
|
||
- `/var/log`:日志文件
|
||
- `/var/run` 或 `/run`:运行时数据,如 PID 文件
|
||
- `/var/spool`:队列和缓冲池数据
|
||
- `/var/tmp`:重启后可能保留的临时文件
|
||
- `/proc`:内核和进程信息的伪文件系统
|
||
- `/sys`:内核设备和驱动信息
|
||
|
||
## 3、目录常用操作命令
|
||
|
||
### 3.1 `pwd`
|
||
|
||
```shell
|
||
pwd
|
||
```
|
||
|
||
示例:
|
||
|
||
```shell
|
||
root@lzc:~# pwd
|
||
/root
|
||
```
|
||
|
||
- `pwd` 用于显示当前工作目录
|
||
- 常和环境变量 `PWD` 对应
|
||
|
||
### 3.2 `cd`
|
||
|
||
用于切换目录。
|
||
|
||
常见用法:
|
||
|
||
- `cd -`:回到上一次所在目录
|
||
- `cd ..`:进入父目录
|
||
- `cd .`:当前目录
|
||
- `cd ~`:当前用户家目录
|
||
- `cd -P`:按物理路径切换,避免符号链接影响
|
||
|
||
### 3.3 `ls`
|
||
|
||
用于列出目录内容。
|
||
|
||
常见选项:
|
||
|
||
- `-a`:显示隐藏文件
|
||
- `-l`:显示详细信息
|
||
- `-R`:递归显示
|
||
- `-X`:按扩展名排序
|
||
- `-S`:按文件大小排序
|
||
- `-h`:配合 `-l` 以易读单位显示大小
|
||
|
||
### 3.4 `tree`
|
||
|
||
用于以树状结构显示目录。
|
||
|
||
常见选项:
|
||
|
||
- `-d`:只显示目录
|
||
- `-L`:限制显示层级
|
||
|
||
### 3.5 `mkdir`
|
||
|
||
用于创建目录。
|
||
|
||
常见选项:
|
||
|
||
- `-p`:递归创建
|
||
- `-m`:创建时直接指定权限
|
||
|
||
### 3.6 `rmdir`
|
||
|
||
用于删除空目录。
|
||
|
||
常见选项:
|
||
|
||
- `-p`:递归删除空目录
|
||
|
||
## 4、Linux 文件基础
|
||
|
||
### 4.1 文件类型
|
||
|
||
在 `ls -l` 输出中,第一列第一个字符表示文件类型:
|
||
|
||
- `-`:普通文件
|
||
- `d`:目录
|
||
- `l`:符号链接
|
||
- `b`:块设备文件
|
||
- `c`:字符设备文件
|
||
- `p`:管道文件
|
||
- `s`:套接字文件
|
||
|
||
### 4.2 inode 是什么
|
||
|
||
inode(index node)可以理解为文件的“元数据记录”。
|
||
|
||
它通常保存的信息包括:
|
||
|
||
- inode 编号
|
||
- 文件类型
|
||
- 权限
|
||
- UID
|
||
- GID
|
||
- 链接数
|
||
- 文件大小
|
||
- 时间戳
|
||
- 指向数据块的指针
|
||
|
||
目录本质上也是特殊文件,它记录了“文件名”和“inode 编号”的对应关系。
|
||
|
||
### 4.3 `cp` 和 `rm` 与 inode 的关系
|
||
|
||
#### 执行 `cp`
|
||
|
||
通常会发生:
|
||
|
||
- 分配新的 inode
|
||
- 创建新的目录项
|
||
- 复制数据块内容
|
||
|
||
因此复制后的文件通常拥有**不同 inode**。
|
||
|
||
#### 执行 `rm`
|
||
|
||
通常会发生:
|
||
|
||
- 删除目录项
|
||
- 减少链接计数
|
||
- 当链接数归零时释放 inode 和数据块
|
||
|
||
## 5、文件状态与时间戳
|
||
|
||
### 5.1 `stat`
|
||
|
||
```shell
|
||
stat 1.txt
|
||
```
|
||
|
||
示例:
|
||
|
||
```shell
|
||
root@lzc:~# stat 1.txt
|
||
File: 1.txt
|
||
Size: 210 Blocks: 8 IO Block: 4096 regular file
|
||
Device: fc02h/64514d Inode: 556125 Links: 1
|
||
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
|
||
Access: 2023-12-05 23:55:07.813678618 +0800
|
||
Modify: 2023-12-05 23:55:07.005686767 +0800
|
||
Change: 2023-12-05 23:55:07.005686767 +0800
|
||
Birth: 2023-12-04 23:44:39.861025975 +0800
|
||
```
|
||
|
||
### 5.2 三个常见时间
|
||
|
||
- `atime`:访问时间,读取文件内容时更新
|
||
- `mtime`:修改时间,文件内容变化时更新
|
||
- `ctime`:变更时间,元数据变化时更新,例如权限、属主、链接数变化
|
||
|
||
## 6、文件名通配符
|
||
|
||
通配符常用于批量匹配文件名:
|
||
|
||
- `*`:匹配 0 个或多个字符,不包含隐藏文件开头的 `.`
|
||
- `?`:匹配任意单个字符
|
||
- `~`:当前用户家目录
|
||
- `~-`:上一个工作目录
|
||
- `[0-9]`:匹配一个数字
|
||
- `[a-z]`:匹配一个小写字母
|
||
- `[A-Z]`:匹配一个大写字母
|
||
- `[abc]`:匹配列表中的任一字符
|
||
- `[^abc]`:匹配不在列表中的任一字符
|
||
- `[:digit:]`:数字字符类
|
||
- `[:lower:]`:小写字母字符类
|
||
- `[:upper:]`:大写字母字符类
|
||
|
||
## 7、常见文件操作命令
|
||
|
||
### 7.1 `touch`
|
||
|
||
用于创建空文件或更新时间戳。
|
||
|
||
- `-a`:仅修改访问时间
|
||
- `-m`:仅修改修改时间
|
||
|
||
### 7.2 `cp`
|
||
|
||
用于复制文件和目录。
|
||
|
||
常见选项:
|
||
|
||
- `-i`:覆盖前提示
|
||
- `-n`:不覆盖已有文件
|
||
- `-r` 或 `-R`:递归复制目录
|
||
- `-a`:尽量保留原属性进行归档复制
|
||
- `-b`:覆盖前创建备份文件
|
||
|
||
### 7.3 `mv`
|
||
|
||
用于移动文件或重命名。
|
||
|
||
- `-b`:覆盖前先备份
|
||
|
||
### 7.4 `rename`
|
||
|
||
用于批量重命名。
|
||
|
||
示例:
|
||
|
||
```shell
|
||
rename 'old' 'new' *
|
||
```
|
||
|
||
不同发行版的 `rename` 实现可能略有差异,实际使用前最好先看帮助文档。
|
||
|
||
### 7.5 `rm`
|
||
|
||
用于删除文件或目录。
|
||
|
||
常见选项:
|
||
|
||
- `-i`:交互确认
|
||
- `-f`:强制删除
|
||
- `-r`:递归删除
|
||
|
||
## 8、链接文件 `ln`
|
||
|
||
### 8.1 硬链接
|
||
|
||
硬链接本质上是让多个文件名指向同一个 inode。
|
||
|
||
特点:
|
||
|
||
- inode 相同
|
||
- 删除其中一个名字,不代表数据立刻消失
|
||
- 不能对目录创建硬链接(通常如此)
|
||
- 一般不能跨文件系统
|
||
|
||
### 8.2 软链接
|
||
|
||
软链接类似快捷方式。
|
||
|
||
创建方式:
|
||
|
||
```shell
|
||
ln -s 源文件 软链接名
|
||
```
|
||
|
||
特点:
|
||
|
||
- inode 不同
|
||
- 保存的是目标路径
|
||
- 可以跨文件系统
|
||
- 原文件删除后,软链接会失效
|
||
|
||
### 8.3 删除软链接的注意点
|
||
|
||
```shell
|
||
rm -rf /data
|
||
```
|
||
|
||
如果 `/data` 是软链接,这样通常只会删除软链接本身。
|
||
|
||
```shell
|
||
rm -rf /data/
|
||
```
|
||
|
||
如果路径末尾带 `/`,可能会把链接目标目录中的内容删掉,操作时一定要格外小心。
|
||
|
||
## 9、小结
|
||
|
||
- Linux 文件系统从根目录 `/` 开始组织
|
||
- 绝对路径和相对路径是最基础的路径概念
|
||
- `pwd`、`cd`、`ls`、`mkdir`、`rm`、`cp`、`mv` 是最常用的文件操作命令
|
||
- inode 记录的是文件元数据,不等于文件名本身
|
||
- `stat` 可用于查看文件详细状态和时间戳
|
||
- 硬链接和软链接的差异是高频面试和实战知识点
|