一、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: 文件名权限对于文件和目录的含义
ls列出的文件颜色
