Linux学习【2】文件管理

1. 文件目录结构

1.1 概览

目录结构

部分介绍:

  1. 根目录(/)

  2. 二进制文件目录(/bin):包含系统启动和运行所需的基础命令

  3. 系统二进制文件目录(/sbin):包含系统管理命令,通常只有系统管理员有权限使用

  4. 配置文件目录(/etc):系统配置文件的存储地,包括用户账户管理、网络配置等

  5. 设备文件目录(/dev):包含硬件和设备的接口文件

  6. 挂载点目录(/mnt):用于挂载外部存储设备或文件系统。当外部设备或文件系统被挂载到mnt目录后,用户就可以通过这个目录来访问和管理这些设备或文件系统

  7. 虚拟文件系统目录(/proc):包含系统运行时的信息,如进程、内存、CPU等

  8. 变动文件目录(/var):存储日志、缓存、邮件等数据

  9. 临时文件目录(/tmp):存放临时文件的地方

  10. 用户程序和共享库目录(/usr):存放系统和应用程序的存放地

    1. centos7及以上,/bin -> /usr/bin, /sbin -> /usr/sbin,进行了软链接。但是在centos早期版本以及ubuntu中并未进行软链接。

1.2 文件系统规则

Linux对文件系统分层结构有标准:FHS(Filesystem Hierarchy Standard)

  1. 标准Linux文件系统(如et4

  2. 大小写敏感

  3. .开头的为隐藏文件

  4. /为目录分隔符

  5. 每个文件都有两类相关数据:

    • metadata(文件本身的属性)

    • data(文件内容)

  6. 不同的文件类型有有不同的颜色:

    • 蓝色:表示目录

    • 绿色:表示可执行文件

    • 红色:表示压缩文件(如.gz文件)

    • 浅蓝色:表示符号链接(软链接)

    • 黄色:表示设备文件(如块设备或字符设备)

    • 灰色:表示其他类型的文件,如文本文件、配置文件等。

1.3 文件类型

类型 备注
- 普通文件
d 目录文件
b 块设备 按固定大小的数据块进行读写,如/dev/sda、SSD、U盘、光盘,有内核缓冲区,可快速随机读取
c 字符设备 按单个字符(字节流)读写,无固定大小,如键盘(/dev/input/mouse0)、鼠标、串口,通常无缓存,仅支持顺序读写
l 符号链接文件
p 管道文件pipe
s 套接字文件socket

字符设备和块设备

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

dev/input

这是因为:

  1. 动态设备编号:键盘被识别为 event0、event1等,具体取决于系统检测顺序,可支持热插拔。

  2. 统一输入子系统: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

  • cd

    cd x 含义
    cd ~ 切换到当前登录用户的家目录
    cd ~用户名 切换到指定用户的家目录
    cd - 返回刚才的路径
    cd / 进入根目录
  • ls

    ls -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, 检测文件类型

file

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

hexdump

此处的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.txtfile9.txt10个文件。而file[0-9].txt是匹配用法。

匹配数字范围

2. ?匹配符

?匹配符

3. 匹配字母范围

[a-c]表示从ac的任意一个匹配即可,但是要注意这中间包含大写字母,即当前匹配范围为a, A, b, B, c

如下图所示,在使用[a-c]匹配时,是按照小写字母-大写字母的顺序进行匹配的,因此在file[a-c].txtfile[a-C].txt所返回的内容是不一样的。

匹配字母范围

4. 匹配特定字符

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

:lower:

5. [string][^string]

匹配列表中任何一个字符

6. *

(1)*无法匹配隐藏文件!

ls结合-a*的不同表现:

ls       # 列出当前目录下的可见文件和子目录,不包括隐藏文件,不递归展开子目录
ls -a    # 列出当前目录下的可见文件和子目录,包括隐藏文件,不递归展开子目录
ls -a *  # 列出当前目录下的可见文件和子目录,不包括隐藏文件,递归展开子目录

ls的不同表现

  • ls -a *会递归展开子目录内容是因为它的逻辑是:
    1. 先处理*,将其展开为当前目录下的所有文件以及目录;
    2. 再针对每个文件或目录执行lsls filename或者ls dir/,此时就会涉及到递归操作;
    3. 由于*本身会屏蔽掉隐藏文件,且-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]' <文件...>

rename

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

4. 软/硬链接

posted @ 2025-07-13 01:49  midorii  阅读(31)  评论(0)    收藏  举报