• Linux文件系统


    来自🥬🐶程序员 Truraly | 田园 的博客,最新文章首发于:田园幻想乡 | 原文链接 | github (欢迎关注)

    文件系统

    linux 目录结构?

    根目录下的文件结构和文件系统有关,不同文件系统可能有不同的目录结构

    常见文件系统:ext3,swap,vfat,iso9660,NFS

    目录结构:

    • /bin:存放系统命令的二进制执行文件(mv,ls 等)
    • /boot:存放系统启动时使用的各种文件
    • /dev:存放设备文件
    • /etc:存放系统配置文件
    • /etc/rc.d:存放系统启动时执行的各种脚本文件
    • /etc/rc.d/init:存放系统初始化文件
    • /home:存放普通用户的主目录
    • /lib:存放系统命令的函数库
    • /lost+found:存放系统异常产生错误的文件
    • /media:挂载目录
    • /misc:挂载目录
    • /mnt:挂载目录
    • /proc:存放系统内存的映射文件
    • /root:超级用户的主目录
    • /sbin:存放系统命令的二进制执行文件(fdisk,shutdown 等)
    • /tmp:存放临时文件
    • /usr:存放系统应用程序
    • /usr/bin:存放系统用户使用的应用程序
    • /usr/sbin:存放超级用户使用的比较高级的管理程序和系统守护程序
    • /usr/src:存放内核源代码
    • /srv:存放服务启动之后需要提取的数据
    • /sys:存放系统硬件设备
    • /var:存放系统执行过程中经常变化的文件

    文件类型:

    • 普通文件(-)
    • 目录文件(d)
    • 链接文件(l)
    • 字符设备©
    • 块设备(b)
    • 套接字文件(s)
    • 命名管道文件§
    • 堆栈文件(f)

    文件权限

    • r:读权限
    • w:写权限
    • x:执行权限
    # 注意,ll 命令需要root权限,普通用户使用 ls -l
    [root@iZuf6f738vgbarr2licuswZ /]# ll
    total 132
    # 文件属性
    lrwxrwxrwx   1 root root     7 Jul 11  2019 bin -> usr/bin
    dr-xr-xr-x   5 root root  4096 Jul 11  2019 boot
    drwxr-xr-x   5 root testgroup   4096 Aug 22 15:58 home
    lrwxrwxrwx   1 root root     7 Jul 11  2019 lib -> usr/lib
    lrwxrwxrwx   1 root root     9 Jul 11  2019 lib64 -> usr/lib64
    drwx------   2 root root 16384 Jul 11  2019 lost+found
    drwxr-xr-x   2 root root  4096 Apr 11  2018 media
    drwxr-xr-x   2 root root  4096 Apr 11  2018 mnt
    -rw-r--r--   1 root root 25548 Apr  7  2017 mysql57.rpm
    dr-xr-x---   12 root root  4096 Aug 22 15:26 root
    drwxr-xr-x   26 root root   740 Aug 20 12:53 run
    lrwxrwxrwx   1 root root     8 Jul 11  2019 sbin -> usr/sbin
    drwxr-xr-x   2 root root  4096 Apr 11  2018 srv
    # 省略了一些
    

    lrwxrwxrwx

    第一个字符代表文件类型(l 代表链接文件),后面三个一组,分别代表文件所有者(u)文件所属组(g)、**其他用户(o)**的权限

    权限的值: r=4,w=2,x=1

    # 例如
    # rwxr-xr-x
    # 4+2+1 4+0+1 4+0+1
    # 755
    

    root testgroup

    第一个 root 代表文件所有者,第二个 testgroup 代表文件所属组

    文件指令

    cd | 切换工作目录

    # 没啥好说的
    # 返回上一个工作目录
    cd -
    # 回到用户目录
    cd ~
    

    pwd | 显示当前工作目录

    # 没啥好说的
    

    ls | 显示文件或目录信息

    # 查看当前目录下的文件
    ls
    # 查看当前目录下的文件,包括隐藏文件(以.开头的文件)
    ls -a
    
    # 查看当前目录下的文件,包括隐藏文件,以及文件的详细信息
    ls -al
    
    # 查看当前目录下的文件类型
    ll
    # 等价于
    ls -l
    
    # 查看当前目录的详细信息
    ls -d
    
    

    更多参数请使用ls --help查看

    mkdir | 创建目录

    # 创建目录
    mkdir [选项] 目录名
    
    # 创建多级目录
    mkdir -p 目录名
    # 如果路径上的目录不存在,则自动创建,不会报错
    
    # 对新目录设置权限
    mkdir -m 权限 目录名
    # 例如
    mkdir -m 777 test
    
    

    rmdir | 删除空目录

    rmdir 只能删除空目录,如果目录中有文件,则不能删除

    # 删除空目录
    rmdir [选项] 目录名
    
    # 一次性删除多个空目录
    rmdir [选项] 目录名1 目录名2 目录名3
    
    

    cat | 查看文件内容

    # 查看文件内容
    cat 文件名
    
    # 查看文件内容,同时显示行号
    cat -n 文件名
    
    # 查看文件内容,同时显示行号,空行不显示
    cat -b 文件名
    
    # 反向显示文件内容
    tac 文件名
    
    
    // test1.c
    #include 
    void main(){
        printf("Hello World! test1");
    }
    

    cp | 复制文件或目录

    cp 命令用于复制文件或目录 vim

    # 复制文件
    cp [选项] 源文件 目标文件
    
    # 复制目录
    cp [选项] 源目录 目标目录
    
    # 复制多个文件到目录
    cp [选项] 源文件1 源文件2 源文件3 目标目录
    
    

    参数

    • -a:相当于-dpR,保留源文件的属性,递归复制目录,保留链接文件
    • -d:复制时保留链接文件
    • -f:强制复制,如果目标文件已存在,则覆盖(ubuntu 默认)
    • -i:交互式复制,如果目标文件已存在,则提示用户是否覆盖
    • -l:创建硬链接文件
    • -p:保留源文件的属性
    • -r:递归复制目录

    mv | 移动文件或目录

    选项:

    • -i:交互式操作,如果目标文件已存在,则提示用户是否覆盖
    • -f:禁止交互操作。在 mv 操作要覆盖某己有的日标文件时不给任何指示,在指定此选项后,选项将不再起作用
    # 移动文件(重命名)
    mv [选项] 源文件 目标文件
    # eg
    mv test1.c test2.c
    # 将test1.c移动到test2.c
    # 如果test2.c已存在,则会覆盖test2.c
    
    # 移动目录
    mv [选项] 源目录 目标目录
    # eg
    mv test1 test2
    # 将test1目录移动到test2目录
    # 如果test2目录已存在,则会将test1目录移动到test2目录下
    # 如果test2目录不存在,则会将test1目录重命名为test2
    # 加不加/都可以
    
    # 移动多个文件到目录
    mv [选项] 源文件1 源文件2 源文件3 目标目录
    

    rm | 删除文件或目录

    选项:

    • -i:交互式操作,如果目标文件已存在,则提示用户是否覆盖
    • -f:强制删除,如果目标文件已存在,则不提示用户,直接删除
    • -r:递归删除目录
    # 删除文件
    rm [选项] 文件名
    
    # 删除目录
    rm [选项] 目录名
    
    # 删除多个文件或目录
    rm [选项] 文件名1 文件名2 文件名3 目录名1 目录名2 目录名3
    
    # 删除目录及其子目录
    truraly2@truraly2-virtual-machine:~/test$ rm -ri test6copy/
    rm: 是否进入目录 'test6copy/'? y
    rm: 是否删除普通文件 'test6copy/test2.c'? y
    rm: 是否进入目录 'test6copy/test4'? y
    rm: 是否删除普通文件 'test6copy/test4/test1.c'? y
    rm: 是否删除目录 'test6copy/test4'? y
    rm: 是否删除目录 'test6copy/'? y
    

    如果没有使用-r 选项,则 rm 不会删除目录

    使用该命令时一旦文件被删除,它是不能被恢复的,所以最好使用-i参数。

    chown & chgrp | 改变文件所有者和所属组

    # 改变文件所有者
    chown [选项] 所有者 文件名
    
    # 改变文件所属组
    chgrp [选项] 所属组 文件名
    
    # 改变文件所有者和所属组
    chown [选项] 所有者:所属组 文件名
    

    参数:

    • -c:只在文件的权限确实已经更改时,才显示其更改动作
    • -f:不显示大多数错误消息
    • -R:递归改变文件所有者和所属组

    chmod | 改变文件权限

    需要 root 权限

    常见参数:

    • -c:只在文件的权限确实已经更改时,才显示其更改动作
    • -f:不显示大多数错误消息
    • -v:详细显示命令的操作结果
    # 改变文件权限
    chmod [选项] 权限 文件名
    
    # 改变文件权限,递归
    chmod -R [选项] 权限 文件名
    
    # eg
    chmod 777 test1.c
    # 将test1.c的权限改为777
    
    chmod -R 777 test1
    # 将test1目录下的所有文件的权限改为777
    
    chmod -R 777 test1 test2 test3
    # 将test1 test2 test3目录下的所有文件的权限改为777
    
    chmod a+x test1.c
    # 为所有用户添加test1.c的执行权限
    # a代表所有用户(所有者-u,所属组-g,其他用户-o)
    
    chmod u+r test1.c
    # 为所有者添加test1.c的读权限
    
    chmod 700   test1.c
    # 将test1.c的权限改只有所有者有读写执行权限
    

    grep | 查找文件内容

    参数:

    • -c:只输出匹配行的计数
    • -i:忽略大小写
    • -n:显示匹配行及行号
    • -v:显示不包含匹配文本的所有行
    • -h:不显示文件名
    • -l:仅显示包含匹配文本的文件名
    • -s:不显示不存在或无匹配文本的错误信息
    # 在根目录下查找包含hello的文件
    grep "hello" / -r
    
    # 在根目录下查找包含hello的文件,忽略大小写
    grep -i "hello" / -r
    
    # 忽略子目录
    grep -i "hello" / -r -d skip
    
    # 匹配a或b
    grep -E "a|b" / -r
    
    
    
    # 也可以通过管道符号来过滤其他命令的输出
    
    # 查看所有进程,过滤出包含node的进程,并显示行号
    ps -e | grep -n node
    
    # 查看所有进程,过滤出包含node的进程,并显示匹配行的计数
    ps -ef | grep -c node
    
    # 查看所有进程,过滤出不包含node的进程,再过滤出包含node的进程
    ps -ef | grep -v node | grep node
    
    # 查看当前目录下的文件,过滤出包含root的文件,并显示行号
    ll | grep -n root
    

    find | 查找文件

    在指定目录中搜索文件,它的使用权限是所有用户

    find [路径] [选项] [描述]

    其中的路径为文件搜索路径,系统开始沿着此目录树向下查找文件。它是一个路径列表,相互用空格分离。
    若缺省路径,那么默认为当前目录。
    其中的描述是匹配表达式,是 find 命令接受的表达式。

    选项常见参数:

    • depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找
    • mount:在查找文件时,不跨越文件系统 mount 点

    描述常见参数:

    • -name:按照文件名查找文件(支持通配符*和?)
    • -perm:按照文件权限来查找文件
    • -user:按照文件属主来查找文件
    • -size:按照文件大小来查找文件
    • -type:按照文件类型来查找文件

    locate | 查找文件

    建立索引来查找文件,速度比 find 快,但是索引不是实时更新的,所以可能会找不到最新的文件

    ubuntu 默认没有安装该命令,需要自己安装 mlocate(用法不一样)

    sudo apt-get install mlocate

    ln | 创建链接文件

    软连接(常用):类似于 windows 的快捷方式,指向文件的路径

    硬链接:在目标处创建一个和原文件一样的文件,文件内容会同步更改但是两个文件的 inode 不同

    # 创建软连接
    ln -s 源文件 目标文件
    # eg
    ln -s test1.c test2.c
    # 创建硬链接
    ln 源文件 目标文件
    
    

    mount | 挂载文件系统

    文件系统挂载命令

    打包压缩相关

    gzip | 对文件进行压缩和解压缩

    gzip [选项] 文件名
    # eg
    gzip test1.c
    # 压缩test1.c,生成test1.c.gz
    # 压缩后的文件名为原文件名加上.gz后缀
    
    gzip -d test1.c.gz
    # 解压test1.c.gz,生成test1.c
    # 解压后的文件名为原文件名去掉.gz后缀
    

    常见参数:

    • -c:将压缩的数据输出到屏幕上,不影响原文件
    • -d:解压缩
    • -r:递归压缩目录下的所有文件(分别压缩,不会生成一个压缩包)
    • -l:显示压缩文件的信息
    • -t:测试压缩文件的完整性
    • -v:显示压缩的过程信息

    tar | 打包压缩文件目录

    先打包成一个文件,再压缩

    tar [选项] [打包后的文件名] 文件目录列表
    

    常见参数:

    • -c:创建打包文件
    • -r:向打包文件末尾追加文件
    • -x:解包
    • -v:显示打包过程
    • -z:调用 gzip 来压缩打包文件,与-x 联用时调用 gzip 完成解压缩
    • -j:调用 bzip2 来压缩打包文件,与-x 联用时调用 bzip2 完成解压缩
    • -Z:调用 compress 来压缩打包文件,与-x 联用时调用 compress 完成解压缩

    打包请务必携带打包后的文件名(.tar也要写)

    # 打包
    tar -cvf david.tar david
    # 将david目录打包成david.tar
    
    # 解包
    tar -xvf david.tar
    # 将david.tar解包到当前目录
    

    文件比较合并相关命令

    diff | 比较文件内容的差异

    # 比较两个文件的差异
    diff [选项] 文件1 文件2
    

    常见参数:

    • -r:递归比较目录下的所有文件
    • -q:只显示是否有差异,不显示具体差异
    • -u:以上下文的方式显示差异

    patch | 合并文件

    # 合并文件
    patch [选项] [文件1  [文件2]]
    

    常见参数:

    • -b:生成备份文件
    • -d:把 dir 设置为解释补丁文件名的当前目录
    • -e:把输入的补丁文件看作是 ed 脚本
    • -pnum:剥离文件名中的前 NUM 个目录部分
    • -t:在执行过程中不要求任何输入
    • -v:显示 patch 的版本号

    vim | 代码编辑器

    命令行模式功能

    功能键功能
    i切换到插入模式,在目前的光标所在处插入输入的文字,已存在的文字会向后退
    a切换到插入模式,并从目前光标所在位置的下一个位置开始输入文字
    o切换到插入模式,且从行首开始插入新的一行
    [ctrl]+[b]屏幕往“后”翻动一页
    [ctrl]+[f]屏幕往“前”翻动一页
    [ctrl]+[u]屏幕往“后”翻动半页
    [ctrl]+[d]屏幕往“前”翻动半页
    0(数字 0)光标移到本行的开头
    G(注意需要大写)光标移动到文件的最后
    nG光标移动到第 n 行
    $移动到光标所在行的“行尾”
    n光标向下移动 n 行
    /name在光标之后查找一个名为 name 的字符串
    ?name在光标之前查找一个名为 name 的字符串
    x删除光标所在位置的一个字符
    X(大写 x)删除光标所在位置的前一个字符
    dd删除光标所在行
    ndd从光标所在行开始向下删除 n 行
    yy复制光标所在行
    nyy复制光标所在行开始的向下 n 行
    p将缓冲区内的字符粘贴到光标所在位置(与 yy 搭配)
    u恢复前一个动作

    底行模式功能

    • i 进入编辑模式
    • ESC 退出编辑模式
    • :wq 保存并退出
    • :w 保存
    • :w filename 另存为
    • :q! 不保存退出
    • :set nu 显示行号
    • :set nonu 取消行号
    • :s 查找(替换)字符串
      • :s/old/new 将当前行第一个 old 替换为 new
      • :s/old/new/g 将当前行所有 old 替换为 new
      • :#,#s/old/new 将 #,# 行间所有 old 替换为 new
        • eg: :1,5s/old/new/g 将 1-5 行间所有 old 替换为 new
      • :%s/old/new/g 将文件内所有 old 替换为 new
      • :%s/old/new/gc 将文件内所有 old 替换为 new,且替换前提示

    emacs | 代码编辑器

    有 GUI 的代码编辑器,可以在 ubuntu 软件中心下载

    参考资料

    ————————————————

    版权声明:本文为 田园幻想乡 的原创文章,遵循 CC 4.0 BY-NA-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:http://truraly.fun/课程笔记/Linux/Linux使用/文件系统.html

  • 相关阅读:
    Lombok依赖
    【C++初阶7-string】真方便,真舒服
    研发效能之技术治理&技术治理架构师
    【AI视野·今日Robot 机器人论文速览 第四十五期】Mon, 2 Oct 2023
    基于51单片机CO2二氧化碳气体浓度检测超限报警Proteus仿真
    Linux的查找,压缩,别名,用户管理的相关命令
    【Linux】进程信号2——阻塞信号,捕捉信号
    数字经济时代文化消费新特征
    二分查找总结
    【Spring boot 使用其他 json 转换框架】
  • 原文地址:https://blog.csdn.net/qq_61940759/article/details/140303621