## 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` 可用于查看文件详细状态和时间戳 - 硬链接和软链接的差异是高频面试和实战知识点