Linux 常用命令归档

前言

本篇文章用于记录一些Linux系统中的常用操作命令。Linux的命令系统是十分强大和复杂的,为了能够熟练进行系统操作,在这里归档一些常用命令以及常用参数,便于随时查看。如果需要更多更细节的一些操作命令,请自行查阅手册。


文件与目录操作命令

  • pwd:显示当前所处路径

    没有任何参数,单纯用来看自己当前处于什么位置。

    1
    2
    user:~/work$ pwd
    /home/Yukirin/work
  • cd:切换工作目录

    1
    2
    3
    4
    5
    6
    cd /home/user/project   # 进入绝对路径
    cd project # 进入相对路径
    cd .. # 返回上一级
    cd ../.. # 返回上两级
    cd ~ # 回到家目录(等价于 cd)
    cd - # 回到上一次所在目录

    这里要注意一下:cd - 不是进入上一级目录,而是类似于出栈撤回的操作。例如当前处于家目录,使用cd /user/project/subdir 跳转后,使用 cd - 回到的不是 /user/project,而是跳转之前的家目录。

  • ls:列出当前目录下内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ls                  # 简单列出
    ls -l # 长格式:权限、链接数、所有者、大小、时间、名字
    ls -a # 显示隐藏文件(以 . 开头)
    ls -h # 人类可读大小(配合 -l)
    ls -lh # 最常用组合
    ls -alh # 显示所有文件 + 长格式 + 易读大小
    ls -t # 按修改时间排序(新的在前)
    ls -r # 反向排序
    ls -S # 按大小排序(大的在前)
    ls -R # 递归列出子目录
    ls -d */ # 只列出目录本身,不展开内容
    ls -i # 显示 inode 号

    实际开发中,最常用的组合是 ls -alh ,能够应对90%的使用场景。在一些Linux的发行版(例如我这个Ubuntu 26.04)会将该命令重定义为 ll,敲命令时直接使用ll更方便。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Yukirin@DESKTOP-8BFBE1K:~$ ll
    total 76
    -rw------- 1 Yukirin Yukirin 5426 Sep 25 16:51 .bash_history
    -rw-r--r-- 1 Yukirin Yukirin 220 Sep 18 18:54 .bash_logout
    ....

    Yukirin@DESKTOP-8BFBE1K:~$ ls -alh
    total 76K
    -rw------- 1 Yukirin Yukirin 5.3K Sep 25 16:51 .bash_history
    -rw-r--r-- 1 Yukirin Yukirin 220 Sep 18 18:54 .bash_logout
    ....

    可使用type命令检查是否有绑定,如果没有,自己绑定一个就可以了。

    1
    2
    Yukirin@DESKTOP-8BFBE1K:~$ type ll
    ll is aliased to `ls -alF'

    我这里定义为 -alF ,给文件名加了类型标记。你也可以自己组合参数进行定义。

    这里讲讲关于 ls -alh 打印出来的各项的含义

    1
    2
    3
    4
    5
    6
    7
    8
    9
    -rw-rw-r--  1  Yukirin Yukirin  153  Sep 26 15:52  file1.txt
    │ │ │ │ │ │ │
    │ │ │ │ │ │ └─ 文件名
    │ │ │ │ │ └─ 最近一次修改时间
    │ │ │ │ └─ 大小(字节)
    │ │ │ └─ 所属组
    │ │ └─ 所有者
    │ └─ 硬链接计数
    └─ 权限
  • tree:树状图显示目录结构

    1
    2
    3
    4
    5
    6
    tree                # 递归显示
    tree -L 1 # 只显示 1 层
    tree -L 2 # 显示 2 层
    tree -d # 只显示目录
    tree -a # 显示隐藏文件
    tree -h # 显示大小

    tree命令可能并没有自带,如果使用tree提示找不到该命令,那么使用下列命令进行安装

    1
    sudo apt install tree

    tree命令效果如下,在查看文件和目录时还是很方便的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Yukirin@DESKTOP-8BFBE1K:~$ tree
    .
    ├── C_Test
    │   └── new.c
    ├── Untitled
    ├── WSL-Neovim排查记录.md
    ├── snap
    │   └── glow
    │   ├── 90
    │   ├── common
    │   └── current -> 90
  • mkdir:目录创建

    1
    2
    3
    4
    mkdir test                  # 创建单个目录
    mkdir dir1 dir2 dir3 # 创建多个目录
    mkdir -p a/b/c # 递归创建多级目录
    mkdir -m 755 test # 创建时指定权限

    这里讲一下:父目录不存在,递归创建时必须带上 -p 参数。直接使用 mkdir dir1/dir2/dir3 是创建不了的

    1
    2
    3
    4
    5
    6
    7
    8
    Yukirin@DESKTOP-8BFBE1K:~$ mkdir dir1/dir2/dir3
    mkdir: No such file or directory

    Yukirin@DESKTOP-8BFBE1K:~$ mkdir -p dir1/dir2/dir3
    Yukirin@DESKTOP-8BFBE1K:~$ tree
    ├── dir1
    │   └── dir2
    │   └── dir3

    关于创建时指定权限:这里的 755 是八进制权限码,每一位对应一类用户的使用权限。

    7-5-5 三位分别代表:

    位置 对应对象 英文
    第 1 位 文件所有者 user (u)
    第 2 位 所属组 group (g)
    第 3 位 其他人 others (o)

    3位数字的各自计算方法:

    数字 权限 含义
    0 --- 无权限
    1 --x 只可执行
    2 -w- 只可写
    3 -wx 可写+执行
    4 r-- 只可读
    5 r-x 可读+执行
    6 rw- 可读+可写
    7 rwx 全部权限

    所以755在这里表示:

    1
    2
    3
    7        5        5
    rwx r-x r-x
    所有者 组 其他人

    需要时直接查表算就行了。其实mkdir在指定权限时也支持符号写法:

    1
    2
    mkdir -m u=rwx,g=rx,o=rx test    # 等价于 755
    mkdir -m a=rwx test # a=所有人,等价于 777

    这些写法都是等价的,符号写法规律很明显,不用查表算数字,我比较喜欢这种方法;不过数字写法速度快,背下常规几种组合之后直接用就行。

  • rmdir:空目录删除

    1
    2
    rmdir test                  # 删除空目录
    rmdir -p a/b/c # 递归删除空目录(a/b/c 都为空时)

    这个命令只能删除空目录,若目录内部有文件将删除失败。删除带文件的目录应该用下文的rm -r 命令,rmdir不是很常用,了解一下。

  • touch:文件创建

    1
    2
    3
    4
    5
    6
    touch file.txt              # 创建空文件
    touch file1 file2 # 创建多个
    touch -c file.txt # 文件不存在时不创建
    touch -a file.txt # 只更新访问时间
    touch -m file.txt # 只更新修改时间
    touch -t 202609260830 file # 指定时间戳:YYYYMMDDhhmm

    这里讲一个有意思的点:touch原意其实并不是创建文件,touch的英文是触摸,原本设计的目的是修改文件的时间戳。不过当touch的目标文件不存在时,会先创建一个新文件。后续慢慢的就都使用该命令来创建文件了。

  • rm:删除文件或目录

    1
    2
    3
    4
    5
    6
    rm file.txt                 # 删除文件
    rm -i file.txt # 删除前询问
    rm -f file.txt # 强制删除,不询问
    rm -r dir # 递归删除目录
    rm -rf dir # 递归强制删除(危险!)
    rm -v file.txt # 显示删除过程
    1
    2
    3
    4
    5
    Yukirin@DESKTOP-8BFBE1K:~/work$ rm -i a.out
    rm: remove regular file 'a.out'? n
    Yukirin@DESKTOP-8BFBE1K:~/work$ ll
    total 36
    -rwxrwxr-x 1 Yukirin Yukirin 16608 Sep 25 16:41 a.out*

    这里要提醒一下:rm -rf / 是删除整个root跟目录的自杀式命令,永远不要执行。现在的发行版基本都会拒绝rm -rf /这个命令,但是最好自己在上层加入一些防误操作保护,不要依赖内部实现。

    -v参数会在终端打印删除了什么。如果需要知道具体删除了哪些文件,可以带上该参数。

    1
    2
    3
    Yukirin@DESKTOP-8BFBE1K:~/work$ rm -v -i a.out
    rm: remove regular file 'a.out'? y
    removed 'a.out'

    可以给rm命令加上别名,带上确认与反馈机制,防止误操作。

    1
    alias rm='rm -i'

    上面我们提到,rm -r 可以用于删除带文件的目录,日常使用删除目录的命令基本都是使用这个。

    这里关于 rm -rf 的使用要注意一下:rm -rfv dir1/dir2/dir3 执行这行命令之后只会删除dir3以及dir3的所有子级目录!而不是摘掉dir1/dir2/dir3整棵树,dir1/dir2 都还在。如果想要摘掉 dir1/dir2/dir3 整棵树应该使用 rm -rfv dir1。这个地方不弄清楚很容易用错。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Yukirin@DESKTOP-8BFBE1K:~$ tree dir1/
    dir1/
    ├── dir2
    │   ├── dir3
    │   └── nana.lua
    └── lala.lua

    2 directories, 3 files
    Yukirin@DESKTOP-8BFBE1K:~$ rm -rfv dir1/
    removed 'dir1/dir2/nana.lua'
    removed 'dir1/dir2/dir3'
    removed directory 'dir1/dir2'
    removed 'dir1/lala.lua'
    removed directory 'dir1/'
    Yukirin@DESKTOP-8BFBE1K:~$ find dir1
    find: ‘dir1’: No such file or directory
  • cp:复制文件和目录

    1
    2
    3
    4
    5
    6
    7
    8
    cp file1 file2              # 复制文件
    cp file1 dir/ # 复制到目录
    cp -r dir1 dir2 # 递归复制目录
    cp -a dir1 dir2 # 归档复制,保留权限、时间、链接
    cp -p file1 file2 # 保留权限和时间
    cp -i file1 file2 # 覆盖前询问
    cp -u file1 file2 # 仅当源更新时才复制
    cp -v file1 file2 # 显示过程
    1
    2
    3
    4
    Yukirin@DESKTOP-8BFBE1K:~/dir1$ cp -vp /home/Yukirin/work/tcp_client.c ../dir1/
    '/home/Yukirin/work/tcp_client.c' -> '../dir1/tcp_client.c'
    Yukirin@DESKTOP-8BFBE1K:~/dir1$ ls /home/Yukirin/dir1/
    dir2 tcp_client.c

    -i参数可以在即将发生覆盖行为时提醒用户。cp默认覆盖是静默无声的,某些情况下可能会导致误冲刷重要文件,所以建议使用别名将 cp -i 封装起来使用。

    Ps:-r 只做递归复制,属性和链接等等不做保留、而 -a 不仅可以递归复制,同时还保留权限、所有者、时间戳、符号链接、硬链接、扩展属性等,尽量做到一模一样。你可以这么理解:-r 只管内容一样,-a 则是原封不动整个文件包括属性一起打包带走。所以做备份时首选 -a 。

    1
    2
    3
    Yukirin@DESKTOP-8BFBE1K:~/dir1$ cp -iv tcp_client.c tcp_back.c
    cp: overwrite 'tcp_back.c'? y
    'tcp_client.c' -> 'tcp_back.c'
  • mv:移动文件/重命名

    1
    2
    3
    4
    5
    6
    7
    mv file1 file2              # 重命名
    mv file1 dir/ # 移动到目录
    mv dir1 dir2 # 重命名目录
    mv -i file1 file2 # 覆盖前询问
    mv -f file1 file2 # 强制覆盖
    mv -v file1 file2 # 显示过程
    mv -u file1 file2 # 仅当源更新时才移动

    mv的用法和参数与cp是一样的。cp是复制,mv是剪切,知道这个就好。

  • file:查看文件类型

    1
    2
    3
    file file.txt               # 文本文件
    file image.png # PNG 图片
    file /bin/ls # ELF 可执行文件

    例如:

    1
    2
    Yukirin@DESKTOP-8BFBE1K:~/dir1$ file tcp_back.c
    tcp_back.c: C source, ASCII text
  • stat:查看文件详细数据

    1
    stat file.txt

    能够看到文件大小、权限、访问时间、修改时间等等。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Yukirin@DESKTOP-8BFBE1K:~/dir1$ stat tcp_back.c
    File: tcp_back.c
    size: 1739 Blocks: 8 IO Block: 4096 regular file
    Device: 8,48 Inode: 79667 Links: 1
    Access: (0664/-rw-rw-r--) Uid: ( 1000/ Yukirin) Gid: ( 1000/ Yukirin)
    Access: 2026-09-26 14:11:45.248891782 +0800
    Modify: 2026-09-26 12:02:43.217786645 +0800
    Change: 2026-09-26 12:02:43.217786645 +0800
    Birth: 2026-09-26 12:01:09.162633570 +0800
  • ln:创建链接

    1
    2
    3
    4
    5
    ln file1 file2              # 硬链接
    ln -s file1 file2 # 软链接(符号链接)
    ln -sf file1 file2 # 强制创建软链接,覆盖已有
    ln -si file1 file2 # 覆盖前询问
    ln -sv file1 file2 # 显示过程

    创建链接分为硬链接和软链接。使用 ln 命令默认创建硬链接;使用 ln -s 创建软连接。

    软链接有点类似Windows桌面的快捷方式,是一个独立的小文件,其内容是指向目标的路径。软连接有自己的inode,如果软连接指向的目标被删除,那么访问软连接时会报:No such file or directory 错误。这是符合常理的,我们在Windows中若快捷方式失活(通常是指向的源文件已被删除),访问也是会报找不到文件错误的。

    硬链接inode是相同的,举个例子:假如原件为 source1,使用 ln 命令为其创建硬链接 source2、 source3,那么source1、source2、source3的inode全都是相同的。这点区别于软链接,我们上面提到过,软链接是一个独立小文件,有自己的inode。

    由于共享inode,硬链接相当于是给原数据上了份保险:上面示例中我们删除掉source1,源数据并不会受损,而这个特性是软链接做不到的。

    这个特性你可以这么理解:我们删除数据时并不是从底层直接销毁数据,而是销毁其指向该部分内存的指针。我们创建了两个硬链接,就相当于多维护了两个指向该块数据的指针。当我们删除source1时,由于2和3仍指向该块数据,所以我们仍然能够获取这块内存,在上层体现出来的就是未被删掉。只有当我们将1、2、3全部删除时,这块数据才是真正丢了,体现在上层就是数据被删除。这就是硬链接的一个特定和优势。

    这里要注意硬链接的两个限制:

    • 不能跨文件系统(因为 inode 只在同一文件系统内唯一)
    • 不能对目录创建硬链接

    软链接没有这个限制。

    上文一直在提到 inode,这里讲讲 inode 是怎么回事:inode全称为 index node(索引节点),是Unix文件系统用来描述一个文件的数据结构。你可以把它理解为一个结构体,内部是所指文件的元数据——例如权限、文件大小、所有者、所属组、链接计数等。其内部还维护有指向文件数据块的指针。

    总的来说 inode = 描述数据的元数据结构体 + 指向数据块的索引。


文件查看

  • cat:打印输出整个文件

    1
    2
    3
    4
    5
    6
    7
    8
    cat file.txt                # 输出全部内容
    cat -n file.txt # 显示行号(所有行)
    cat -b file.txt # 显示行号(跳过空行)
    cat -s file.txt # 连续空行压缩为一行
    cat -A file.txt # 显示不可见字符($ 表示行尾,^I 表示 Tab)
    cat file1 file2 # 拼接多个文件输出
    cat file1 file2 > merged # 合并写入新文件
    cat > file.txt # 从键盘输入,Ctrl+D 结束

    我们这里有如下两个示例文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    file1.txt
    The quick brown fox jumps over the lazy dog.
    This sentence contains every letter of the alphabet.
    It is often used for typing practice and font testing.

    file2.txt
    Linux 的 cat 命令全称是 concatenate,意思是连接。
    它最常见的用途是查看文件内容,也可以把多个文件拼在一起。
    配合重定向符号,还能快速创建或追加文件。

    使用 cat file1 file2 拼接输出可以得到:

    1
    2
    3
    4
    5
    6
    7
    Yukirin@DESKTOP-8BFBE1K:~/docTest$ cat file1.txt file2.txt
    The quick brown fox jumps over the lazy dog.
    This sentence contains every letter of the alphabet.
    It is often used for typing practice and font testing.
    Linux 的 cat 命令全称是 concatenate,意思是连接。
    它最常见的用途是查看文件内容,也可以把多个文件拼在一起。
    配合重定向符号,还能快速创建或追加文件。

    将拼接的输出创建为一个新文件 file3.txt

    1
    2
    3
    4
    5
    6
    7
    8
    Yukirin@DESKTOP-8BFBE1K:~/docTest$ cat file1.txt file2.txt > file3.txt
    Yukirin@DESKTOP-8BFBE1K:~/docTest$ cat file3.txt
    The quick brown fox jumps over the lazy dog.
    This sentence contains every letter of the alphabet.
    It is often used for typing practice and font testing.
    Linux 的 cat 命令全称是 concatenate,意思是连接。
    它最常见的用途是查看文件内容,也可以把多个文件拼在一起。
    配合重定向符号,还能快速创建或追加文件。

    使用 cat > 文件 命令可以创建一个新文件,并且文件内容为你在终端输入的内容。输入完毕后 Ctrl+D 落盘。

    一般小文件使用cat方便快速查看和编辑,对于大文件不要使用cat,会刷屏。如果不慎刷屏使用 Ctrl+C 强行终止本轮调用。

  • less:分页查看

    1
    2
    3
    4
    5
    less file.txt               # 打开文件
    less +F file.txt # 实时跟踪(类似 tail -f)
    less -N file.txt # 显示行号
    less -S file.txt # 不换行,超长行横向滚动
    less -i file.txt # 搜索时忽略大小写

    分页查看用于日常查看大文件,内部支持简单的文本搜索功能,可以当作是一个简易的记事本。

    进入分页模式后有如下几个常用命令:

    按键 功能
    空格 / PageDown 下一页
    b / PageUp 上一页
    g 跳到文件头
    G 跳到文件尾
    /pattern 向下搜索
    ?pattern 向上搜索
    n 下一个匹配
    N 上一个匹配
    q 退出
    F 进入实时跟踪模式(Ctrl+C 退出)

    注意:这里less的默认搜索是大小写敏感的,大小写输入错误是匹配不到的;如果不需要大小写敏感,可以使用less -I 打开文件。参数搜索栏支持基本的正则表达式,以下的形式都是可以的:

    1
    2
    3
    4
    /^Error          # 以 Error 开头的行
    /error$ # 以 error 结尾的行
    /foo.*bar # foo 后跟任意字符再到 bar
    /[0-9]\+ # 一个或多个数字(注意 + 号要转义)

    搜索特殊字符时要记得转义,例如搜索/本身要用:/\/。此处给一个文本中搜索IP地址的示例:

    1
    /[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+
  • head:查看文件开头

    1
    2
    3
    4
    5
    head file.txt               # 默认前 10 行
    head -n 20 file.txt # 前 20 行
    head -n -5 file.txt # 除了最后 5 行,全部显示
    head -c 100 file.txt # 前 100 字节
    head -q file1 file2 # 多文件时不显示文件名

    使用演示示例如下(还是以上文 file1.txt file2.txt 为例):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Yukirin@DESKTOP-8BFBE1K:~/docTest$ cat file1.txt
    The quick brown fox jumps over the lazy dog.
    This sentence contains every letter of the alphabet.
    It is often used for typing practice and font testing.

    Yukirin@DESKTOP-8BFBE1K:~/docTest$ head -n 1 file1.txt
    The quick brown fox jumps over the lazy dog.

    Yukirin@DESKTOP-8BFBE1K:~/docTest$ head -n -1 file1.txt
    The quick brown fox jumps over the lazy dog.
    This sentence contains every letter of the alphabet.

    Yukirin@DESKTOP-8BFBE1K:~/docTest$ head -c 30 file1.txt
    The quick brown fox jumps over

    Yukirin@DESKTOP-8BFBE1K:~/docTest$ head file1.txt file2.txt
    ==> file1.txt <==
    The quick brown fox jumps over the lazy dog.
    This sentence contains every letter of the alphabet.
    It is often used for typing practice and font testing.

    ==> file2.txt <==
    Linux 的 cat 命令全称是 concatenate,意思是连接。
    它最常见的用途是查看文件内容,也可以把多个文件拼在一起。
    配合重定向符号,还能快速创建或追加文件。

    Yukirin@DESKTOP-8BFBE1K:~/docTest$ head -n 2 file1.txt file2.txt
    ==> file1.txt <==
    The quick brown fox jumps over the lazy dog.
    This sentence contains every letter of the alphabet.

    ==> file2.txt <==
    Linux 的 cat 命令全称是 concatenate,意思是连接。
    它最常见的用途是查看文件内容,也可以把多个文件拼在一起。
  • tail:查看文件尾部

    1
    2
    3
    4
    5
    6
    7
    tail file.txt               # 默认后 10 行
    tail -n 20 file.txt # 后 20 行
    tail -n +5 file.txt # 从第 5 行开始,显示到末尾
    tail -c 100 file.txt # 后 100 字节
    tail -f log.txt # 实时跟踪新增内容(最常用!)
    tail -F log.txt # 跟踪文件,文件被删除重建后继续跟踪
    tail -f -n 100 log.txt # 先显示后 100 行,再实时跟踪

    该命令用法与head是一样的,此处不做过多阐述。这里讲讲什么叫实时跟踪:tail -f或 tail -F 可以启用实时跟踪功能。实时跟踪指的是,文件内容在增长时,终端自动跟随显示最新的追加内容。

    例如我们使用 tail -f log.txt 监控日志文件,该条命令被执行后终端立即被挂起。当应用程序产生新日志并且写入到 log.txt 中时,终端会立即显示出来。

    -f / -F 两个参数都是开启文件跟踪,区别在于-f跟踪的是文件描述符,当文件移走后(例如该文件日志已满,需要mv到别的地方,并在原地重新创建新日志文件),-f跟踪的是旧文件,看不到新文件。

    而-F跟踪的是文件名,所以旧文件移走并原地创建新文件后能够继续跟踪,而不会跟丢。日常看日志用 -f,如果日志会被轮转,移走重建,用 -F 更稳妥。

  • wc:统计文件行数、字数、字节数

    1
    2
    3
    4
    5
    6
    7
    wc file.txt                 # 输出:行数 单词数 字节数
    wc -l file.txt # 只统计行数(最常用)
    wc -w file.txt # 只统计单词数
    wc -c file.txt # 只统计字节数
    wc -m file.txt # 只统计字符数
    wc -L file.txt # 最长行的长度
    ls | wc -l # 统计当前目录文件数

    示例如下:

    1
    2
    Yukirin@DESKTOP-8BFBE1K:~/docTest$ wc file3.txt
    6 34 362 file3.txt

    输出从左至右分别为:该文件内容行数、单词数、总字节数。

    这里讲讲 wc -c 与 wc -m 的区别:-c统计的是字节,-m统计的是字符。在全英文文本的情况下,二者是等价的,但是对于中文或其它语言等多字节字符时就完全不同。举个例子:文件1内容为:“Hello,World”,通过wc -c 或 wc -m 统计出来都是 11 个字节/字符;文件2内容为:“你好世界”,由于中文字符为宽字符,UTF8中通常占3个字节,因此 wc -c 统计出来应为12个字节,wc -m 统计出来应为4个字符。这就是二者的差别。

    wc -m 的解析依赖当前的locale编码来判断一个字符是几个字节,如果locale没设置对那么 -m 计算出的字符数就是不准确的,这里要注意。

  • du:查看文件及目录的磁盘占用空间

    1
    2
    3
    4
    5
    6
    du file.txt                 # 文件占用(块单位)
    du -h file.txt # 人类可读(KB/MB/GB)
    du -sh dir/ # 目录总大小(最常用)
    du -sh * # 当前目录下每个文件/目录大小
    du -h --max-depth=1 # 只显示 1 层深度
    du -ah dir/ # 包含所有文件

    这里在使用时可能你会发现一个统计问题(还是以上述file1/2/3.txt为例):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Yukirin@DESKTOP-8BFBE1K:~/docTest$ ls -alh
    -rw-rw-r-- 1 Yukirin Yukirin 153 Sep 26 15:52 file1.txt
    -rw-rw-r-- 1 Yukirin Yukirin 209 Sep 26 15:52 file2.txt
    -rw-rw-r-- 1 Yukirin Yukirin 362 Sep 26 16:05 file3.txt

    Yukirin@DESKTOP-8BFBE1K:~/docTest$ du -sh *
    4.0K file1.txt
    4.0K file2.txt
    4.0K file3.txt

    Yukirin@DESKTOP-8BFBE1K:~/docTest$ cd ..
    Yukirin@DESKTOP-8BFBE1K:~$ du -sh docTest/
    16K docTest/

    发现了吗?我们文件大小为 153/209/362,通过磁盘占用统计出来竟然是4Kb?这里要强调一下:du的占用统计是从磁盘的角度来计算的,而磁盘是由簇和扇区构成的,簇是整个文件系统最小的分配单位,而簇又由多个扇区构成。目前我们的几个文件都只有几百字节,大小是很小的,但是依然需要占用一个簇和其中一个扇区,所以统计出来才为4Kb。这也侧面说明我们当前这个系统的文件系统最小扇区为4.0Kb。

  • df:查看磁盘分区使用情况

    1
    2
    3
    4
    df -h                       # 人类可读(最常用)
    df -h /home # 只看指定挂载点
    df -i # 查看 inode 使用情况
    df -T # 显示文件系统类型

    这里要分清 du/df 的区别:du是针对单个文件以及目录进行磁盘占用统计,而df是从宏观上针对整个磁盘进行统计。

  • hexdump:十六进制查看

    1
    2
    3
    hexdump -C file.bin         # 标准十六进制 + ASCII(最常用)
    hexdump -C -n 64 file.bin # 只看前 64 字节
    hexdump -C -s 128 file.bin # 从偏移 128 开始

    这是Linux用来以16进制查看文件的原生工具,在平时分析一些协议时也很常用。默认情况下每行输出16字节,半字分组。最左侧是偏移量,中间是数据内容:

    1
    2
    3
    4
    5
    Yukirin@DESKTOP-8BFBE1K:~/docTest$ hexdump file3.txt
    0000000 6854 2065 7571 6369 206b 7262 776f 206e
    0000010 6f66 2078 756a 706d 2073 766f 7265 7420
    0000020 6568 6c20 7a61 2079 6f64 2e67 540a 6968
    ....

    不过这种方式不太直观,可以使用 hexdump -C 将其拆成标准16进制格式。

    1
    2
    3
    4
    Yukirin@DESKTOP-8BFBE1K:~/docTest$ hexdump -C file3.txt
    00000000 54 68 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 |The quick brown |
    00000010 66 6f 78 20 6a 75 6d 70 73 20 6f 76 65 72 20 74 |fox jumps over t|
    00000020 68 65 20 6c 61 7a 79 20 64 6f 67 2e 0a 54 68 69 |he lazy dog..Thi|
    1
    2
    3
    4
    5
    6
    00000000  54 68 65 20 71 75 69 63  6b 20 62 72 ...         |Hello World.|
    │ │ │ │
    │ │ │ └─ ASCII 显示
    │ │ └─ 后8个字节
    │ └─ 前8个字节
    └─ 偏移量(十六进制!)

    不过hexdump不只可以看16进制,也可以其它进制的方式进行查看。其命令参数如下所示:

    选项 作用
    -C 规范 hex + ASCII
    -b 每字节显示为八进制
    -c 每字节显示为字符(转义形式)
    -d 每字节显示为十进制
    -o 每字节显示为八进制(两位)
    -x 每字节显示为十六进制
    -n N 只显示前 N 字节
    -s N 跳过前 N 字节再显示
    -v 不省略重复行(默认连续相同行会显示 *)
  • xxd:十六进制查看

    1
    2
    3
    4
    xxd file.bin                # 十六进制 + ASCII
    xxd -l 64 file.bin # 前 64 字节
    xxd -s 128 file.bin # 从偏移 128 开始
    xxd -r hex.txt > file.bin # 反向:十六进制文本还原为二进制

    这个命令与上面的hexdump是高度重合的。区别在于,hexdump是系统原装的,而xxd是vim编辑器的附件工具包。如果你没有装Vim的话可能没有这个工具。xxd有反色显示,我个人比较喜欢xxd的观感,所以常用xxd。

    xxd还有个hexdump做不到的特性,那就是能够进行反向还原:将16进制重新还原回2进制。

    1
    2
    xxd file.bin > dump.txt        # 导出为文本
    xxd -r dump.txt > back.bin # 从文本还原为二进制

    hexdump没有这个功能,所以在做二进制<->文本转换时使用xxd。

  • grep:文本搜索

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    grep "error" log.txt            # 搜索包含 error 的行
    grep -i "error" log.txt # 忽略大小写
    grep -n "error" log.txt # 显示行号
    grep -v "error" log.txt # 反向:不包含 error 的行
    grep -c "error" log.txt # 统计匹配行数
    grep -r "error" dir/ # 递归搜索目录
    grep -rn "error" dir/ # 递归 + 行号
    grep -w "error" log.txt # 只匹配整词
    grep -A 3 "error" log.txt # 显示匹配行及后 3 行
    grep -B 3 "error" log.txt # 显示匹配行及前 3 行
    grep -C 3 "error" log.txt # 前后各 3 行
    grep -E "err|warn" log.txt # 扩展正则(或)
    grep -l "error" *.txt # 只显示匹配的文件名

    grep是Linux中最常用的搜索工具。使用场景十分广泛,例如我要在某个文件或某几个文件中找内容:

    1
    2
    grep "error" app.log
    grep -n "TODO" *.c # -n 显示行号

    再或者配合管道,从输出中过滤出需要的内容:

    1
    2
    3
    ps aux | grep nginx         # 找 nginx 进程
    ls -alh | grep ".txt" # 只看 txt 文件
    df -h | grep "/dev/sda" # 只看某个磁盘

    grep还有个很强大的地方是支持基本正则表达式(BRE)和拓展正则表达式(ERE),如果会用正则的话那么grep将非常高效和强大:

    1
    2
    3
    4
    5
    grep "^Error" app.log          # 以 Error 开头
    grep "done$" app.log # 以 done 结尾
    grep -E "error|fail|warn" app.log # 匹配多个词之一
    grep -E "[0-9]{3}-[0-9]{4}" file # 电话格式
    grep "colou\?r" file # 注意 ? 号转义

查找与定位

作者

R6bandito

发布于

2026-09-26

更新于

2026-10-08

许可协议

评论

音乐
0:000:00