Linux学习【2】文件管理
1. 文件目录结构
1.1 概览

部分介绍:
-
根目录(/)
-
二进制文件目录(/bin):包含系统启动和运行所需的基础命令
-
系统二进制文件目录(/sbin):包含系统管理命令,通常只有系统管理员有权限使用
-
配置文件目录(/etc):系统配置文件的存储地,包括用户账户管理、网络配置等
-
设备文件目录(/dev):包含硬件和设备的接口文件
-
挂载点目录(/mnt):用于挂载外部存储设备或文件系统。当外部设备或文件系统被挂载到mnt目录后,用户就可以通过这个目录来访问和管理这些设备或文件系统
-
虚拟文件系统目录(/proc):包含系统运行时的信息,如进程、内存、CPU等
-
变动文件目录(/var):存储日志、缓存、邮件等数据
-
临时文件目录(/tmp):存放临时文件的地方
-
用户程序和共享库目录(/usr):存放系统和应用程序的存放地
- centos7及以上,/bin -> /usr/bin, /sbin -> /usr/sbin,进行了软链接。但是在centos早期版本以及ubuntu中并未进行软链接。
1.2 文件系统规则
Linux对文件系统分层结构有标准:FHS(Filesystem Hierarchy Standard)
-
标准Linux文件系统(如
et4) -
大小写敏感
-
以
.开头的为隐藏文件 -
/为目录分隔符 -
每个文件都有两类相关数据:
-
metadata(文件本身的属性) -
data(文件内容)
-
-
不同的文件类型有有不同的颜色:
-
蓝色:表示目录
-
绿色:表示可执行文件
-
红色:表示压缩文件(如.gz文件)
-
浅蓝色:表示符号链接(软链接)
-
黄色:表示设备文件(如块设备或字符设备)
-
灰色:表示其他类型的文件,如文本文件、配置文件等。
-
1.3 文件类型
| 类型 | 备注 | |
|---|---|---|
- |
普通文件 | |
d |
目录文件 | |
b |
块设备 | 按固定大小的数据块进行读写,如/dev/sda、SSD、U盘、光盘,有内核缓冲区,可快速随机读取 |
c |
字符设备 | 按单个字符(字节流)读写,无固定大小,如键盘(/dev/input/mouse0)、鼠标、串口,通常无缓存,仅支持顺序读写 |
l |
符号链接文件 | |
p |
管道文件pipe | |
s |
套接字文件socket |

Linux 系统将输入设备(如键盘、鼠标)统一管理在/dev/input/目录下,但设备名称并非固定的 keyboard,而是动态生成的eventX或by-id/符号链接。

这是因为:
-
动态设备编号:键盘被识别为 event0、event1等,具体取决于系统检测顺序,可支持热插拔。
-
统一输入子系统:Linux使用统一的evdev驱动处理所有输入设备,而非为每个设备单独命名。
root@midori-vm:/# ll /dev/zero
crw-rw-rw- 1 root root 1, 5 7月 20 23:37 /dev/zero
root@midori-vm:/# echo 0
0
root@midori-vm:/# vim test.txt
root@midori-vm:/# cat t
test.txt tmp/
root@midori-vm:/# cat test.txt
0
root@midori-vm:/# hexdump -C t
test.txt tmp/
root@midori-vm:/# hexdump -C test.txt
00000000 30 0a |0.|
00000002
root@midori-vm:/# dd if=/dev/zero of=test.txt bs=1 count=1
1+0 records in
1+0 records out
1 byte copied, 0.000325459 s, 3.1 kB/s
root@midori-vm:/# ll test.txt
-rw-r--r-- 1 root root 1 7月 21 18:15 test.txt
root@midori-vm:/# cat test.txt
root@midori-vm:/# hexdump -C test.txt
00000000 00 |.|
00000001
| 操作 | 写入内容 | Hex 值 | 显示效果 | 本质区别 |
|---|---|---|---|---|
| echo 0 > test.txt | ASCII 字符 '0' | 0x30 0x0a | 显示 0 | 文本格式的字符 |
| dd if=/dev/zero ... | 数值 0(NULL) | 0x00 | 不显示(空) | 二进制格式的零值 |
echo 0→ 写入 ASCII 字符 '0'(0x30)/dev/zero→ 写入数值 0(0x00)
2. 创建和查看文件
2.1 查看命令
-
pwd -
cdcd x 含义 cd ~ 切换到当前登录用户的家目录 cd ~用户名 切换到指定用户的家目录 cd - 返回刚才的路径 cd / 进入根目录 -
lsls -xx 含义 ls -l 文件名 查看单个文件,文件大小以bytes单位显示 ls -lh 文件名 自动转换为易读的单位(KB、MB、GB 等),根据大小动态调整 ls -a 显示隐藏文件(包括 . 开头的文件),注意只显示隐藏文件 ls -l /path 查看目录内容权限 ls -d /path 仅查看目录本身(不显示内容) ls -R /path 递归列出目录及其子目录下所有文件和子目录 ls -S /path 按文件大小降序排序显示目录内容,延伸:ls -Sl | head -n 5 ls -1 /path 每行显示一个文件/目录 -
每个文件有三个时间戳:
时间类型 缩写 全称 触发更新的操作 查看命令 修改时间 mtime Modification Time 文件内容被修改(如编辑文本、覆盖数据) ls -l 变更时间 ctime Change Time 文件元数据或内容被修改(如权限、所有者、链接数变化,或内容修改时连带更新) ls -lc 访问时间 atime Access Time 文件被读取(如 cat、grep)或执行(对脚本) ls -lu -
stat,查看文件详细信息 -
file, 检测文件类型

hexdump -C filename,以十六进制和ASCII形式显示文件内容

此处的5c 72是指\和r两个字符(hex而非decimal),如果想真正插入回车符(\r):
echo -e "Line1\rLine2" > output.txt # -e启用转义
# 或
# printf "Line1\rLine2\n" > output.txt
-
dos2unix/unix2dos系统 换行符 说明 Windows \r\n(CRLF)回车( \r) + 换行(\n)Unix/Linux \n(LF)仅换行( \n)
2.2 文件通配符
| 通配符 | 说明 |
|---|---|
| * | 匹配0个或多个字符 |
| ? | 匹配任何单个字符 |
| ~ | 当前用户家目录 |
| ~usrname | usrname的家目录 |
| ~+和. | 当前工作目录 |
| ~- | 前一个工作目录 |
| [0-9] | 匹配数字范围 |
| [a-z] | 字母 |
| [A-Z] | 字母 |
| [string] | 匹配列表中的任何一个字符 |
| [^string] | 匹配列表中的所有字符以外的字符 |
1. 匹配数字范围
[0-9]表示从数字0到数字9的任意一个匹配即可。
注意下图,file{0..9}.txt是扩展命令用法,代表从file0.txt到file9.txt10个文件。而file[0-9].txt是匹配用法。

2. ?匹配符

3. 匹配字母范围
[a-c]表示从a到c的任意一个匹配即可,但是要注意这中间包含大写字母,即当前匹配范围为a, A, b, B, c。
如下图所示,在使用[a-c]匹配时,是按照小写字母-大写字母的顺序进行匹配的,因此在file[a-c].txt和file[a-C].txt所返回的内容是不一样的。

4. 匹配特定字符
| 通配符 | 说明 |
|---|---|
| :digit: | 任意数字,相当于0-9 |
| :xdigit: | 十六进制字符 |
| :upper: | 任意大写字母,表示A-Z |
| :lower: | 任意小写字母,表示a-z |
| :alpha: | 任意大小写字母 |
| :alnum: | 任意数字或字母 |
| :blank: | 水平空白字符 |
| :space: | 水平或垂直空白字符 |
| :punct: | 标点符号 |

5. [string]和[^string]

6. *
(1)*无法匹配隐藏文件!
ls结合-a和*的不同表现:
ls # 列出当前目录下的可见文件和子目录,不包括隐藏文件,不递归展开子目录
ls -a # 列出当前目录下的可见文件和子目录,包括隐藏文件,不递归展开子目录
ls -a * # 列出当前目录下的可见文件和子目录,不包括隐藏文件,递归展开子目录

ls -a *会递归展开子目录内容是因为它的逻辑是:
- 先处理
*,将其展开为当前目录下的所有文件以及目录;- 再针对每个文件或目录执行
ls,ls filename或者ls dir/,此时就会涉及到递归操作;- 由于
*本身会屏蔽掉隐藏文件,且-a的控制范围仅限于传递给ls的参数,也就是说解析*后,传递给ls的实际上就不包含隐藏文件,所以就算有-a也不会展示隐藏文件。
(2)使用*只显示目录
ls -d /etc/*/

7. 范例
显示/etc目录下以rc开头,后面是0-6之间的数字,其它为任意字符的文件或目录列表:
ls -d /etc/rc[0-6]*

2.3 创建命令
2.3.1 touch
touch [OPTION]... FILE...
OPTION:
-
-a,仅改变atime和ctime -
-m,仅改变mtime和ctime -
-t [[CC]YY]MMDDhhmm[.ss],指定atime和mtime的时间戳 -
-c,如果文件不存在,则不予创建
root@midori-vm:/home/midori/test# ls
a.txt test1
root@midori-vm:/home/midori/test# cleat
Command 'cleat' not found, did you mean:
command 'cheat' from snap cheat (4.4.0.build.2)
command 'claat' from snap claat (v0.7.1)
command 'clear' from deb ncurses-bin
See 'snap info <snapname>' for additional versions.
root@midori-vm:/home/midori/test# clear
root@midori-vm:/home/midori/test# ls
a.txt test1
root@midori-vm:/home/midori/test# touch b.txt
root@midori-vm:/home/midori/test# stat b.txt
File: b.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 801h/2049d Inode: 5898343 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2025-07-28 22:57:34.936832659 +0800
Modify: 2025-07-28 22:57:34.936832659 +0800
Change: 2025-07-28 22:57:34.936832659 +0800
Birth: -
root@midori-vm:/home/midori/test# touch b.txt
root@midori-vm:/home/midori/test# stat b.txt
File: b.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 801h/2049d Inode: 5898343 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2025-07-28 22:57:41.220369341 +0800
Modify: 2025-07-28 22:57:41.220369341 +0800
Change: 2025-07-28 22:57:41.220369341 +0800
Birth: -
root@midori-vm:/home/midori/test# touch -a b.txt
root@midori-vm:/home/midori/test# stat b.txt
File: b.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 801h/2049d Inode: 5898343 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2025-07-28 22:57:48.955791631 +0800
Modify: 2025-07-28 22:57:41.220369341 +0800
Change: 2025-07-28 22:57:48.955791631 +0800
Birth: -
root@midori-vm:/home/midori/test# touch -m b.txt
root@midori-vm:/home/midori/test# stat b.txt
File: b.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 801h/2049d Inode: 5898343 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2025-07-28 22:57:48.955791631 +0800
Modify: 2025-07-28 22:57:53.743430229 +0800
Change: 2025-07-28 22:57:53.743430229 +0800
Birth: -
root@midori-vm:/home/midori/test# ls
a.txt b.txt test1
root@midori-vm:/home/midori/test# touch -c c.txt
root@midori-vm:/home/midori/test# ls
a.txt b.txt test1
3. 复制、转移和删除文件
3.1 复制命令cp
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
OPTION:
-
-i,覆盖前提示 -
-a,备份过程可见 -
-r/-R,递归复制 -
-a,归档,相当于-dR --preserv=all -
-d,不复制原文件,只复制链接名- 若不指定,单独的
cp在复制软链接时会直接复制链接所指向的文件
- 若不指定,单独的
-
-p,相当于--preserv=mode,ownership,timestap -
-f,--force -
-b,若目标存在,覆盖前先备份,形式为filename~,只保留最近的一个备份 -
--backup=numbered,和-d的区别是可保留多份备份,形式为filename.~num~

3.2 移动命令mv
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv可以给单独的文件改名,如果需要批量修改文件名,则采用rename:
mv oldname.txt /path/to/newdir/newname.txt
rename [options] 's/<表达式>/<替换>/[flags]' <文件...>

3.3 删除命令rm
rm: remove,rm删除的是存储在硬盘(或SSD)上的文件数据,挂载点和映射到内存中的东西是无法被删除的。
rm [OPTION]... FILE...
OPTION:
-
-i,交互式 -
-f,强制删除 -
-r,递归删除
rm -rf * # 除隐藏文件外全部删除
rm -rf .[^.]* # 删除隐藏文件,且避免删除父目录
rm -rf * .[^.]* # 同时删除隐藏文件和非隐藏文件


在生产过程中rm命令很危险,建议用mv命令替代rm命令,如:mv /path/to/dir/filename /path/to/dir/filename.bak。

浙公网安备 33010602011771号