FChao
发布于 2026-03-24 / 18 阅读
0
0

RHCSA/HCIA③:文件管理

一、Linux的文件目录结构

文件系统结构的对比

  • Linux是一个单根倒树状结构。所有的文件子目录都是从‘/’出发,/ 既是Linux中的根目录(根分区),也是Linux中路径的分隔符

  • Linux中的命令和文件均区分大小写

  • Windows是一个多根多树状结构,每一个盘就是一个根

  • Windows中的命令和文件均不区分大小写

一切皆文件

在 Linux 世界里,“一切皆文件”(Everything is a File)是其最核心的设计哲学。不论是真正的文档(如 .txt、.jpg),还是硬件设备(如硬盘、键盘、鼠标),或者是网络通信、进程信息,系统都给它们指定了文件路径。

所有东西都抽象成了一个可以“打开、读取、写入、关闭”的文件描述符 (File Descriptor)。统一接口之后,程序员不需要为显卡写一套代码,再为键盘写一套完全不同的代码。只要学会了“读写文件”,就能操控整个系统。

而 Windows 把功能封装成专业化的 API(应用程序接口)。

二、Linux中的主要目录和作用

  • /afs 专门用来挂载分布式文件系统 (Andrew File System)

  • /boot 存放系统的内核和启动引导文件

  • /dev 存放系统中所有的设备接口文件,删除会导致不可逆故障

  • /etc 存放系统、软件相关的配置文件

  • /home/username 表示普通用户的家目录,以用户名命名,例如/home/zhangsan 表示张三的家目录

  • /lost+found 当系统非正常关机,会将文件碎片文件保存到此目录下

  • /media和/mnt 默认为空,作为光盘、U盘、硬盘等设备临时挂载的目录

    • 在安装了图形化界面的情况下,U盘等会自动挂载到/media

  • /opt 存放额外安装的、第三方的大型软件包,一般都为空

  • /proc 进程信息和系统运行时内核状态,重启时清空

  • /root 表示超级管理员root用户的家目录;存放用户相关的数据,例如用户的桌面文件、下载的文件、以及自定义的软件配置文件

  • /run 存放系统自启动以来运行时的信息,重启时清空

  • /srv 默认为空,存储特定服务的一些文件,比如网站文件、ftp文件等等

  • /sys 存放硬件信息、可以直接修改的硬件参数等,重启时清空

  • /tmp 系统的临时目录,所有的用户都可以将自己的临时文件存放到该目录下,重启后清空所有内容

  • /usr 共享的库,依赖的文件,自定义安装的软件都存放在该目录下,删除会导致不可逆故障

    • /usr/bin 存放可执行程序(用户的指令),来自包管理器安装的软件

    • /usr/sbin 存放管理员的指令

    • /bin和/sbin是软链接(快捷方式),指向/usr/bin和/usr/sbin

    • /usr/local 手动安装的软件的根目录

    • /usr/local/bin 源码编译安装的软件

    • /usr/local/lib 用户自建库,包含手动编译的.so文件

  • /usr/lib和/usr/lib64 主要存放的是系统运行所必需的共享库

    • 文件名通常以 .so(Shared Object)结尾,它们就像是 Windows 里的 .dll 文件,包含了很多程序通用的代码。

    • /lib和/lib64 软链接(快捷方式),指向/usr/lib和/usr/lib64。现代发行版本的趋势是系统基础文件和用户数据彻底分开,通过软链接,无论脚本写哪个路径,系统都能找到对应的程序。

  • /var 存放服务的数据和系统的日志

三、文件和目录命名规则

1.文件和目录的命名不能超过255个字符

2.除了路径分隔符(/)以外,所有的字符都可以作为文件名

3.在Linux中文件和目录的名称严格区分大小写

当创建的文件名中带有特殊符号且这个符号属于Shell元字符(具有特殊含义),应该使用单引号转义。

touch 'fchao*file^'

在ls时,带有特殊字符的文件名会被单引号标注;在TAB时,会在特殊字符补上转义符号\

touch $'file\nwith\nnewlines.txt'

  • 没有 $ 的情况:文件名就叫 file\nwith\nnewlines.txt

  • 有 $ 的情况:识别出 \n 是一个转义序列,代表一个换行符 (New Line),文件的名字在逻辑上是三行:

    • 第一行是 file

    • 第二行是 with

    • 第三行是 newlines.txt

四、文件管理的操作

在系统中找到文件有两个方式:

相对路径:相对于当前工作目录的子目录路径

绝对路径:以根开头,在系统的任意路径位置都可以使用,是文件的全路径

.代表当前目录,.. 代表上一级目录

cd(change directory)

  • cd /etc 进入到一个绝对路径或者是相对路径下的目录中

  • cd .. 回退到上一级目录,可以叠加为cd ../..,回到上上级目录

  • cd - 回退到上一次目录

  • cd / cd ~ 返回到当前用户的家目录

  • cd ~username 返回到指定用户的家目录

  • pwd 打印当前的工作目录,也就是当前用户在什么位置

cp

  • cp [选项] 源路径 目标路径

    • 如果目标路径下已经存在该文件,则会覆盖文件

    • 如果目标路径指定了文件名,则拷贝时拷贝文件并重命名

  • cp -r 递归拷贝(拷贝目录包括其中内容)

  • cp -p 拷贝文件时保留权限和时间戳

  • cp -d 当直接复制一个符号链接时,cp 会顺着链接找到它指向的原始文件,然后把原始文件的内容复制一份。而-d会复制链接本身,而不是链接指向的文件内容。

  • cp -a 拷贝文件的全部属性,包括连同文件的权限一并拷贝(备份配置文件时使用),包括-rpd的全部作用。

  • -r 和 -a 都可以拷贝文件夹,当目标目录不存在时,分两种情况

    • cp -r 文件夹A 存在的路径/存在文件夹B,则拷贝后:存在的路径/文件夹B/文件夹A

    • cp -r 文件夹A 存在的路径/不存在的文件夹B,则拷贝后A被改名成了文件夹B

    • cp -r 文件夹A 不存在的路径/XXXX,父目录不存在,会报错

  • cp -f 强制拷贝,适合脚本使用,当重复文件存在时不询问直接覆盖,如果对目标文件夹有写权限和执行权限,则除特殊情况外,不管重复的文件是什么权限设定都会覆盖

touch、stat和时间戳

touch 文件名 创建一个空白的文件,或是更新已经存在的文件的时间戳

时间戳的作用:

  • 用于文件同步备份:检测到文件的时间戳变化,则判断文件进行了修改,则直接同步到后面的备份服务器

  • 用于文件安全检测:检测到文件的时间戳变化,就能判断文件是否被入侵恶意篡改,Linux高级入侵检测平台- AIDE 就把时间戳作为检测维度之一。

文件的时间戳:

  • Access Time Atime——> 文件最后一次被访问的时间,被cat等命令读取时刷新

  • Modify Time Mtime ——> 文件最后一次被修改内容的时间

  • Change Time Ctime ——> 文件最后一次被改变属性的时间,如修改权限等

  • Birth Time Btime ——> 文件的创建时间,很多老旧的 Linux 文件系统(如 ext2/3)不支持记录这个时间,此时会显示为 -。在现代的 ext4、xfs 或 btrfs 上通常可以显示。在较旧的内核版本下/tmp目录里的文件也没有Btime。

手动修改mofiytime时间戳:

touch -md '2025-12-12 10:15:15' file

-m 只修改modify时间

-d 格式化修改日期

stat:查看文件“元数据”(Metadata)最完整的工具

stat test.txt

File: test.txt
  Size: 15          Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 131078      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/  user)   Gid: ( 1000/  user)
Access: 2023-10-27 14:30:00.000000000 +0800
Modify: 2023-10-27 14:31:00.000000000 +0800
Change: 2023-10-27 14:32:00.000000000 +0800
 Birth: 2023-10-27 14:29:00.000000000 +0800

-----------------------------------------------
Size: 文件内容的实际字节数(这里是 15 字节)。
Blocks: 文件在磁盘上占用的物理块数(通常每个块是 512 字节,这里占用 8 块)。
IO Block: 系统建议的每次读取/写入的块大小(4096 字节,通常对应一个内存页)。
文件类型: 这里是 regular file(普通文件)。也可能是 directory(目录)、symbolic link(符号链接)等。
-----------------------------------------------
Device: 该文件所在的硬件设备编号(16 进制/10 进制)。
Inode: 文件的 Inode 节点号。这是文件在文件系统中的唯一身份证号,文件名只是指向这个号的标签。
Links: 硬链接数。如果这个数字大于 1,说明有多个文件名指向同一个物理数据块。
-----------------------------------------------
第三行:权限与所有者,具体在后续用户权限讲解

mkdir和rmdir

  • mkdir 目录的路径 直接创建目录

  • mkdir -p 目录1/目录2/目录3 递归创建目录(当上一级目录不存在时,直接创建完整的目录结构)

  • rmdir 目录的路径 专门用来删除目录,但是只能删除空白的目录,如果目录里有任何文件(包括普通文件、隐藏文件、甚至是子目录),rmdir 都会直接报错

  • rmdir -p 目录1/目录2/目录3 递归删除空目录,具体而言是先删除目录3,目录2就变成了空目录,再删除目录2,目录1就变成了空目录,最后就可以全部删除,如果说目录3下面还有目录,会报错无法删除

rm

  • 在现代Linux发行版中,图形界面(GUI)才有回收站机制,命令行(CLI)默认没有

  • rm filename 删除一个文件,等同于执行 rm -i,会询问用户是否确认删除

  • rm -f filename 强制直接删除

  • rm -r dir 递归删除(先将目录中的内容删除,然后再删除目录本身)

  • rm -rf 递归强制删除(非常危险)

  • rm -rf * 删除当前目录下所有内容(通配符知识)

mv

mv 源文件 目标路径/目标文件

  • 如果目标文件不存在,则源文件直接移动到目标路径位置

    • mv /opt/file /tmp/

  • 如果目标文件存在,则源文件覆盖目标文件(危险)

    • mv /opt/file /tmp/file

  • 如果目标文件不存在,但是用户指定了目标文件名,则移动文件并改名

    • mv /opt/file /tmp/file123

  • 如果源文件和目标文件在同一个路径下,则是重命名

    • mv /opt/file /opt/file.txt

file

file 命令用来辨别文件类型,不看后缀名,只看文件本质内容。 即使把一个 .jpg 图片改名为 .txt,file 命令依然能一眼识别是图片。

示例 A:普通文本文件

命令:file test.txt
输出:test.txt: ASCII text

  • 含义:这是一个纯文本文件,编码格式为 ASCII(最基础的英文字符编码)。

  • 如果是中文文件,可能会显示 UTF-8 Unicode text

示例 B:可执行二进制程序(最复杂的输出)

命令:file /bin/ls
输出:/bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=..., for GNU/Linux 3.2.0, stripped

  • ELF: Linux 标准可执行文件格式。

  • 64-bit: 适用于 64 位系统。

  • x86-64: 适用于 Intel/AMD 的 64 位处理器。

  • dynamically linked: 动态链接(运行时需要调用 /lib 里的共享库)。

  • stripped: 符号表已裁剪(去掉了调试信息,文件更小,生产环境常用)。

示例 C:图片文件

命令:file logo.png
输出:logo.png: PNG image data, 500 x 500, 8-bit/color RGBA, non-interlaced

  • PNG image data: 确认这是 PNG 格式。

  • 500 x 500: 图片的像素尺寸。

  • 8-bit/color RGBA: 每种颜色占 8 位,包含红绿蓝及透明度。

示例 D:脚本文件

命令:file myscript.sh
输出:myscript.sh: POSIX shell script, ASCII text executable

  • POSIX shell script: 这是一个 Shell 脚本。

  • executable: 它是可执行的(因为它有 #! 声明和执行权限)

ls和文件权限

ls 列出当前目录下的文件和子目录

ls /路径 列出指定目录下的文件和子目录

ls -a 列出隐藏文件

ls -l 查看文件的长格式(详细信息),等同于ll

ls -ld 查看目录的长格式(详细信息)

ls -R 以目录树的形式查看目录的层级结构

ll列出的权限信息

[root@openEuler opt]# ls -l zhangsan.txt 
-rw-r--r--. 1 root root 0 Jul 14 14:41 zhangsan.txt

-: 第一列(-rw-r--r--)的第一个字符表示文件类型,表示文件的类型

      -:表示普通文件
      d:表示目录 (Directory)
      l:符号链接 (Link)
      c:字符设备 (Character),逐个字符读取的设备,如键盘、串口、虚拟终端
      b:块设备 (Block),按数据块随机读取的设备,如硬盘、U 盘
      s:套接字 (Socket),用于网络或本地进程间通信的文件
      p:管道 (Pipe/FIFO),用于进程间传递数据

rw-r--r--:剩余的九个字符表示文件或者目录的权限

      r:表示读取权限(readable)
      w:表示写入权限,删除需要有w权限(writable)
      x:表示执行权限(executable)
      -:表示没有对应权限

rw-:前三个表示文件的拥有人权限,该文件的拥有者可读、可写,不可执行
r--:中间三个表示文件的拥有组权限,该文件的所属组用户可读、不可写、不可执行
r--:后三个文件的其他用户权限,不是拥有者和所属组的用户可读、不可写、不可执行

.: seLinux的安全标记,表示文件受到seLinux的保护
1: 表示文件的硬链接数

root: 表示文件的UID也就是拥有人
root: 表示文件的GID也就是拥有组
0:表示文件的大小,如果为0则表示是一个空文件
Jul 14 14:41: 文件最后一次被修改的时间
zhangsan.txt: 文件名

权限对于文件和目录的含义

文件

目录

R读

可以读取文件的内容

可以查看目录下的文件和子目录,允许列出文件

W写

修改或编辑文件的内容

可以在目录下创建或者删除文件和子目录

X执行

可以将文件作为命令或者是脚本执行

可以进入到目录下

ls列出的文件颜色


评论