5、linux文件系统和常用文件管理命令

5.1 linux文件系统

5.1.1 file命令及其用法

          file + 文件或目录:查看文件类型

       可执行二进制文件格式: 

          Windows: PE

          Linux: ELF

5.1.2 Linux文件系统

          1、Linux文件系统的一些概念

                    rootfs: 根文件系统(每个文件系统都必须是根文件系统内的路径) 

                    FHS(文件系统层级标准):Linux

          2、Linux文件系统目录及各目录作用

           (1)/boot: 

                   系统启动相关的文件,如内核、initrd,以及grub(bootloader)

             [daniel@localhost share]$ ls /boot

                     config-3.10.0-693.el7.x86_64

                     efi

                      grub(引导加载器)

                      grub2

                     initramfs-0-rescue-35642350c74f4b3287a0e5a8634f72ea.img

                      initramfs-3.10.0-693.el7.x86_64.img(系统启动的系统文件)

                     initramfs-3.10.0-693.el7.x86_64kdump.img

                     initrd-plymouth.img

                      symvers-3.10.0-693.el7.x86_64.gz

                     System.map-3.10.0-693.el7.x86_64

                     vmlinuz-0-rescue-35642350c74f4b3287a0e5a8634f72ea

                     vmlinuz-3.10.0-693.el7.x86_64(内核)

           (2)/dev: 设备文件

        设备文件:

            块设备:随机访问,可以随机访问任意位置的数据,数据块

            字符设备:线性访问,按字符为单位(鼠标和显示器)

            特殊设备没有大小,只有设备号

            设备号:主设备号(major)和次设备号(minor)

    (3)/etc:配置文件

        大多数程序的配置文件都放在此目录或者此目录的子目录

    (4)/home:用户的家目录

        每一个用户的家目录通常默认为/home/USERNAME

    (5)/root:管理员的家目录;

    (6)/lib:库文件

        静态库,  .a,便于程序单个运行使用

        动态库, .dll, .so (shared object),可以共享使用节省空间

        /lib/modules:内核模块文件

    (7)/media:挂载点目录

        挂载移动设备

    (8)/mnt:挂载点目录

        额外的临时文件系统

    (9)/opt:可选目录

        早期第三方程序的安装目录,现在通常放于/usr/local中

    (10)/proc:伪文件系统

        内核映射文件

    (11)/sys:伪文件系统

        跟硬件设备相关的属性映射文件

    (12)/tmp:临时文件

         /var/tmp,另外一个临时目录

    (13)/var:可变化的文件

        /bin: 可执行文件, 用户命令

        /sbin:管理命令

    (14)/usr:shared, read-only:全局共享的只读文件

        /usr/bin:系统启动之后运行正常系统功能的需要的文件

        /usr/sbin

        /usr/lib

        /usr/local:第三方软件的安装路径

            /usr/local/bin

            /usr/local/sbin

            /usr/local/lib

5.1.3 命名规则

    命名规则:

        1、长度不能超过255个字符;

        2、不能使用/当文件名

        3、严格区分大小写

    绝对路径:相对于根节点的路径

    相对路径:相对于当前位置的路径

5.1.4 操作系统功能

    操作系统:

        运行程序

        设备管理

        软件管理

        进程管理

        网络管理

5.1.5 文件管理

    1、文件创建和删除

        (1)touch

            # touch 主要作用修改文件时间戳,也可用来创建文件(linux同一个目录下不能创建名称相同的文件夹和文件)

            -a 只改变访问时间

            -m 只改变修改时间

            -t 指定修改的时间

            -c 若文件不存在也不创建新文件

            stat file显示文件的状态信息

而文件夹确实是类似文本文件的方式存储的,文件夹可以看做文件inode:文件名组成的文本文件 (文件的属性信息存在inode的元信息中,可以用stat file查看)。只要文件夹内未发生文件的新增、删除、软链或文件夹内文件的inode (也称为索引节点)未改变,文件夹 (代表文件夹的文本文件)的时间戳就不会发生变化。

From <https://cloud.tencent.com/developer/article/1520817>

        [daniel@localhost ~]$ touch -m -t 201212121212 x

        [daniel@localhost ~]$ stat x

          File: ‘x’

          Size: 15          Blocks: 0          IO Block: 4096   directory

        Device: fd02h/64770d    Inode: 33554496    Links: 3

        Access: (0775/drwxrwxr-x)  Uid: ( 1000/  daniel)   Gid: ( 1000/  daniel)

        Context: unconfined_u:object_r:user_home_t:s0

        Access: 2021-06-01 12:55:16.734391633 -0400

        Modify: 2012-12-12 12:12:00.000000000 -0500

        Change: 2021-06-01 12:57:12.073157790 -0400

         Birth: -

                创建文件也可以使用文件编辑器来创建

                     word为字处理器,不是文本编辑器,处理的不仅仅是文本

        (2)ASCII码

             ASCII: 美国国家标准信息交换代码

            128不同的字符要存储在计算机上:

             计算机只能保存二进制:

            2^6=0,63  64个数字

            2^7=0,127 128个数字

            000 0000 - 111 1111

            ASCII:通过不同的位数变化来表示某个字符

            2^16: 65536

           字符标准:GB18030, GBK, GB2312(国标),Unicode(全球统一标准)

            0000 1001 0000 1110:上, 卫(它为ASCII码还是字符取决于使用的字符转换器)

                           linux文本剪辑器:nano

        (3)rm

        删除文件

            -i:删除前询问

            -f:强行删除,不接受提示

            -r:递归删除目录下所有文件

        rm -rf /

                    (ROOT用户可以通过此命令清理所有文件)

        任何操作之前确认一下,再操作

       (4)cp

        复制和移动文件cp

        cp: copy只有最后一个是目标,前面的都是源,默认只复制文件,不复制目录

        cp SRC DEST

            -r:递归复制目录和目录下的文件(不能覆盖文件)

            -p:保存用户原有的属主,属组和时间戳

            -P:保持文件自有的链接属性

            -a:归档复制,常用于备份

        cp file1 file2 file3

        可复制一个文件到一个文件

        也可复制多个文件到一个目录

            cp /etc/{passwd,inittab,rc.d/rc.sysinit} /tmp/

说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息

参数:

     -a 或 --archive     此参数的效果和同时指定"-dpR"参数相同

     -b 或 --backup      删除、覆盖目的文件先备份,备份的文件或目录亦建立为符号链接,并指向源文件或目录链接的源文件或目录。假如没有加上这个参数,在复制过程中若遇到符号链接,则会直接复制源文件或目录

     -f 或 --force       强行复制文件或目录, 不论目的文件或目录是否已经存在

     -i 或 --interactive 覆盖文件之前先询问用户

     -l 或 --link        对源文件建立硬链接,而非复制文件

     -p 或 --preserve    保留源文件或目录的属性,包括所有者、所属组、权限与时间

     -P 或 --parents     保留源文件或目录的路径,此路径可以是绝对路径或相对路径,且目的目录必须已经丰在

     -r                  递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理

     -R 或 --recursive   递归处理,将指定目录下的文件及子目录一并处理

     -s 或 --symbolic-link  对源文件建立符号链接,而非复制文件

     -S <备份字尾字符串> 或 --suffix=<备份字尾字符串> 用"-b"参数备份目的文件后,备份文件的字尾会被加上一个备份字符串。默认的备份字尾符串是符号"~"

     -u 或 --update      使用这项参数之后,只会在源文件的修改时间(Modification Time)较目的文件更新时,或是名称相互对应的目的文件并不存在,才复制文件

     -v 或 --verbose     显示执行过程

     -V <备份方式> 或 --version-control=<备份方式>  指定当备份文件时,备份文件名的命名方式,有以下3种:

                         1.numbered或t, 将使用备份编号,会在字尾加上~1~字符串,其数字编号依次递增

                         2.simple或never 将使用简单备份,默认的备份字尾字符串是~, 也可通过-S来指定

                         3.existing或nil将使用当前方式,程序会先检查是否存在着备份编号,若有则采用备份编号,若无则采用简单备份

     -x 或 --one-file-system  复制的文件或目录存放的文件系统,必须与cp指令执行时所处的文件系统相同,否则不复制,亦不处理位于其他分区的文件

     --help              显示在线帮助

     --sparse=<使用时机>  设置保存希疏文件的时机

     --version           显示版本

示例:

    .复制文件,只有源文件较目的文件的修改时间新时,才复制文件

     cp -u -v file1 file2

    .将文件file1复制成文件file2

     cp file1 file2

    .采用交互方式将文件file1复制成文件file2

     cp -i file1 file2

    .将文件file1复制成file2,因为目的文件已经存在,所以指定使用强制复制的模式

     cp -f file1 file2

    .将目录dir1复制成目录dir2

     cp -R file1 file2

    .同时将文件file1、file2、file3与目录dir1复制到dir2

cp -R file1 file2 file3 dir1 dir2

    .复制时保留文件属性

     cp -p a.txt tmp/

    .复制时保留文件的目录结构

     cp   --parents   /var/tmp/a.txt  ./temp/

    .复制时产生备份文件

     cp -b a.txt tmp/

    .复制时产生备份文件,尾标 ~1~格式

     cp -b -V t   a.txt /tmp    

    .指定备份文件尾标    

     cp -b -S _bak a.txt /tmp

        (5)mv: move

        移动文件

        mv SRC DEST

            mv -t DEST SRC将多个源文件复制到同一个目标

            mv -f DEST SRC 强制覆盖

        mv abc mn:将abc移动到当前目录,并且更改名称为mn

        (6)install

            install SRC DEST:可用来复制文件

                 -d 指定DIRECOTRY ... :可用于创建目录

                 install -t DIRECTORY SRC...:把多个文件复制到同一个目录

5.1.6 目录管理

1、查看目录

                   ls

                   cd

                   pwd

2、mkdir

    mkdir:创建空目录,只有路径中的最后一个点才是要创建的目录

        -p:循环创建目录

        -v: verbose详细信息,显示创建过程

    例:mkdir /root/x/y/z

    创建多个目录

        /mnt/test/x/m,y

        (1)mkdir -pv /mnt/test/x/m /mnt/test/y

        (2)mkdir -pv /mnt/test/{x/m,y}

3、展开

    (1)波浪线展开

             ~USERNAME (波浪线展开):cd自动转换到用户家目录

       (2)命令行展开(花括号展开):

        /mnt/test/

        创建如下几个目录a_b, a_c, d_b, d_c

        类似于(a+d)(b+c)=ab+ac+db+dc

        所以可以写为{a,d}_{b,c}

        [root@Daniel-R480 ~]# mkdir -pv /mnt/test/{a,d}_{b,c}

        mkdir: created directory ‘/mnt/test/a_b’

        mkdir: created directory ‘/mnt/test/a_c’

        mkdir: created directory ‘/mnt/test/d_b’

        mkdir: created directory ‘/mnt/test/d_c’

        [root@Daniel-R480 ~]# ls /mnt/test/

        a_b  a_c  d_b  d_c

4、tree

    # tree:查看目录树

    [daniel@localhost ~]$ tree /mnt/test

    test

    ├── a_c

    ├── a_d

    ├── b_c

    └── b_d

5、rmdir

    删除目录:rmdir (remove directory)

        默认只能删除空目录

        -p:循环删除空文件夹

    [root@Daniel-R480 ~]# rmdir /mnt/test/

    rmdir: failed to remove ‘/mnt/test/’: Directory not empty

练习:

    1、创建目录

        (1)在/mnt下创建boot和sysroot;

        [root@Daniel-R480 ~]# mkdir /mnt/{boot,sysroot}

        [root@Daniel-R480 ~]# ls /mnt

        boot  c  d  etst  sysroot  test

        [root@Daniel-R480 ~]# 

        (2)在/mnt/boot下创建grub;

        [root@Daniel-R480 ~]# mkdir /mnt/boot/grub

        [root@Daniel-R480 ~]# ls /mnt/boot/

        grub

        (3)在/mnt/sysroot下创建proc, sys, bin, sbin, lib, usr, var, etc, dev, home, root, tmp

            a)在/mnt/sysroot/usr下创建bin, sbin, lib

            b)在/mnt/sysroot/lib下创建modules

            c)在/mnt/sysroot/var下创建run, log, lock

            d)在/mnt/sysroot/etc下创建init.d

            [root@Daniel-R480 ~]# mkdir /mnt/sysroot/{proc,sys,bin,sbin,lib,usr,var,etc,dev,home,root,tmp}

            [root@Daniel-R480 ~]# mkdir /mnt/sysroot/usr/{bin,sbin,lib}

            [root@Daniel-R480 ~]# mkdir /mnt/sysroot/lib/modules

            [root@Daniel-R480 ~]# mkdir /mnt/sysroot/var/{run,log,lock}

            [root@Daniel-R480 ~]# touch /mnt/sysroot/etc/init.d

            [root@Daniel-R480 ~]# tree /mnt/sysroot/

            [root@Daniel-R480 ~]# tree /mnt/sysroot/

            /mnt/sysroot/

            ├── bin

            ├── dev

            ├── etc

            │   └── init.d

            ├── home

            ├── lib

            │   └── modules

            ├── proc

            ├── root

            ├── sbin

            ├── sys

            ├── tmp

            ├── usr

            │   ├── bin

            │   ├── lib

            │   └── sbin

            └── var

                ├── lock

                ├── log

                └── run

 作业1:

    1、创建目录/backup

        # mkdir -v /backup

    2、复制目录/etc至/backup目录中,并重命名为“etc-当前日期”,如etc-2013-02-26;要求保留文件原来的属性,保持链接文件;

        cp

            -r 

            -p

            -d

        # cp -a /etc /backup/etc-2013-02-28

命令替换

    3、复制文件/etc/inittab为/tmp/inittab.new,并删除inittab.new文件的后两行;

        # cp /etc/inittab  /tmp/inittab.new

        # nano /tmp/inittab.new

作业2:

    1、思考:ls命令是否可以显示某目录的整体大小,即包括其内部的所有文件的整体大小?

    [root@Daniel-R480 tmp]# ls -lht

    total 516K

    -rw-r--r-- 1 root root   18 Jun 18 18:01 b

    -rw-r--r-- 1 root root   12 Jun 18 17:36 a

    -rwxr-xr-x 1 root root    0 Jun 10 09:47 test

    -rw------- 1 root root 248K Jun  8 18:01 yum_save_tx.2021-06-08.18-01.yIzI_S.yumtx

    -rw------- 1 root root 256K Jun  8 17:08 yum_save_tx.2021-06-08.17-08.qKUX5n.yumtx

    -rwx------ 1 root root  836 Jan 29  2019 ks-script-QveTmi

    -rwx------ 1 root root 4.7K Jan 29  2019 ks-script-5qnQJp

    -rw------- 1 root root    0 Jan 29  2019 yum.log

    2、通过帮助手册,学习使用du命令;

        # du 估计文件空间使用情况

            -s (summarize,显示总计情况)

            -h(显示大小)

        [root@Daniel-R480 tmp]# du

        0   ./.font-unix

        0   ./.ICE-unix

        0   ./.Test-unix

        0   ./.X11-unix

        0   ./.XIM-unix

        516 .

        [root@Daniel-R480 tmp]# du -h

        0   ./.font-unix

        0   ./.ICE-unix

        0   ./.Test-unix

        0   ./.X11-unix

        0   ./.XIM-unix

        516K    .

        [root@Daniel-R480 tmp]# du -s

        516 .

        [root@Daniel-R480 tmp]# du -sh

        516K    .

        [root@Daniel-R480 tmp]# 

    3、通过帮助,学习read命令;

        变量:内存空间,有名称

        变量赋值:

        变量替换

作业3:

    描述GPL, BSD, Apache三个开源协定的大体联系及区别。

作业4:

    1、如何获取Linux当前最新的内核版本号?

        www.kernel.org

    2、列出你所了解的Linux发行版,并说明其跟Linux内核的关系。

        Linux, GNU: GNU/Linux, 以源代码发布

        在源代码编译之后形成发行版:Fedora, RedHat(CentOS), SUSE, Debian(Ubuntu, Mint), Gentoo, LFS(Linux From Scratch)

        编译:将源代码编译成可以在对应的硬件平台上安装运行的版本

        C程序

             Tom,在AMD上编译

            Jerry在intel上编译

        RedHat: 通用格式

            奔腾:

        性能配置最好的状态,在本机上编译,进行安装

Comments Closed.