Linux系统中常用的压缩和解压缩工具:
    压缩:以时间换空间的一种操作;
    压缩的实现:标记 + 替换
    压缩比:某个文件在压缩操作之前与压缩操作之后的文件大小的比值;(比值越大,压缩结果越小)
    通常来说,纯文本文件的压缩比比较大;

Linux中常用的压缩工具:
    compress/uncompress  (比较粗糙,压缩比较小)
        会在文件名的后面增加.Z的后缀名称;(xxx.Z)
    gzip/gunzip
        会在文件名的后面增加.gz的后缀名称;(xxx.gz)
    bzip2/bunzip2
        会在文件名的后面增加.bz2的后缀名称;(xxx.bz2)
    xz/unxz     (目前较优秀的压缩工具)
        会在文件名后面增加.xz的后缀名称;(xxx.xz)
    zip/unzip
        会在压缩包名后增加.zip的后缀名称;(xxx.zip)
        注意:保留原文件,并额外制造出一个压缩包文件;


    gzip工具
        gzip, gunzip, zcat -  压缩、解压、在压缩状态下查看文本内容
    常用选项:
        -d:解压缩,相当于gunzip;
        -#:指定压缩时使用的压缩比,有效范围:1-9;--fast = -1  ,--best  =  -9  ;默认为 -6;
        -c:将压缩结果输出到标准输出,但不对原文件进行压缩处理;

    bzip2工具
        bzip2, bunzip2 - 一种块排序文件压缩软件
           bzcat - 将文件解压缩至标准输出
           bzip2recover - 恢复损坏的 bzip2 文件
    常用选项:
        -k:不删除原文件
        -d:解压缩
        -c:将压缩结果输出到标准输出,但不对原文件进行压缩处理;
        -#:指定压缩时使用的压缩比,有效范围:1-9;--fast = -1  ,--best  =  -9  ;默认为 -9;

    xz工具     --较优秀的压缩工具    (压缩比较高会过度消耗CPU)   
        xz, unxz, xzcat,压缩、解压、在压缩状态下查看文本内容
    常用选项:
        -d:解压缩
        -k:不删除原文件
        -#:指定压缩时使用的压缩比,有效范围:0-9,默认为-6;
        -c:将压缩结果输出到标准输出,但不对原文件进行压缩处理;

    zip工具
        zip - package and compress (archive) files
    格式:
        zip  [options]   [zip‐file [file ...]]  
    常用选项:
        -P:压缩并设置密码

        unzip  -l :查看压缩包中的文件列表;


    tar命令:归档

    选项:
        主选项:
            -c:创建档案文件
            -r:向一个已经存在的档案文件的末尾添加新的文件;
            -t:列表显示一个档案的内容;
            -u:仅向档案文件的末尾追加内容比档案文件中的内容更新的文件;
            -x:从档案中获取文件,释放文件;
        辅助选项:
            -f:使用档案文件时用于指明档案文件名称的选项;
            -C:在释放档案中的文件时,不是释放至当前目录,而是指定一个额外的路径存放被释放出的文件;
            -j:主要用于创建档案文件时,选择使用bzip2工具压缩档案文件;
            -J:主要用于创建档案文件时,选择使用xz工具压缩档案文件;
            -z:主要用于创建档案文件时,选择使用gzip工具压缩档案文件;
            -Z:主要用于创建档案文件时,选择使用compress工具压缩档案文件;
            -k:在释放档案中的文件时,如果目标位置有与档案中同名的文件,则此类文件不释放;保证文件系用中的文件不会被档案中的同名文件覆盖;
            -v:显示详细过程;
            --exclude=PATTERN:在释放档案中的文件时被PATTERN匹配到的文件将不被释放;

            (在使用tar命令时,其后面的主选项可不是用 - )

    cpio命令
        copy files to and from archives--存取归档包中的文件
    常用选项:
        -a, --reset-access-time:读取完文件后重置文件的访问时间, 这样看上去就象没有访问过这个文件.
        -f, --nonmatching:只复制那些不被匹配的文件
        -H FORMAT, --format=FORMAT:选择归档格式
             FORMAT:
                 bin    老式的 binary 格式.
                 odc    老式的 (POSIX.1) 跨平台格式.
                 newc   新型 (SVR4) 跨平台格式, 支持大于65536i节点的文件系统.
                 crc    新型 (SVR4) 跨平台格式, 并且计算校验和.
                 tar    老式的 tar 格式.
                 ustar  POSIX.1 tar格式, 也能识别GNUtar归档文件,它们相似但不全相同.             
                hpbin  HP UNIX 上的 cpio 使用的老式的binary格式. (用独特的方法储存设备文件)
                 hpodc  HP UNIX 上的 cpio 使用的跨平台 格式. (用独特的方法储存设备文件)
        -L, --dereference:复制符号连接的文件而不是链接本身
        -R [user][:.][group], --owner [user][:.][group]:在copy-out和copy-pass模式中, 把所有文件的属主设置为指定的用户和/或用户组. 无论用户还是用户组都必须在.如果省略用户组,但却给出了分隔符 ":" 或 ".',则使用该用户的登录用户组.只有超级用户能够改变 文件的属主.
        -t, --list:显示归档包中的内容;
        -v, --verbose:显示详细信息,通常与-t一同使用
        -V --dot:每处理完一个文件显示一个“.”
        -i, --extract:进入copy in模式
        -o, --create:进入copy out模式
        -p, --pass-through:进入copy pass模式
        三种模式:
            copy out:在copy-out模式中,cpio把文件复制到归档包.它从标准输入读取件名列表,每行一个文件名. 生成的归档包写到标准输出.产生文件名列表的 典型方法是使用find 命令; 你可能要在find后面用上 -depth 选项,减少因为进入没有访问权限的目录引起的麻烦.

            copy in:在copy-in模式中,cpio从归档包读取文件,或者列出归档包的内容,归档包来自标准输入.任何非选项命令行参数被视为shell的通配符模式串 (globbing pattern); 在归档包中,只读取文件名匹配这些模式串的文件. 和shell环境不一样,文件名起始处的'.'可以匹配模式串起始处的通配符, 文件名中 的 '/' 也可以 匹配通配符.如果没有给出模式串,那么读取所有文件.
             
             copy pass:在copy-pass模式中, cpio把文件从一棵目录树复制到另一棵, 它结合了copy-in和copy-out的操作,但是没有使用 归档包.  cpio 从 标准输入取欲复制的文件名列表;目标目录是非选项命令行参数.

    eg:写一个脚本:提示用户输入一些文件的路径,并让用户选择压缩方式,根据用户需求对选定的文件进行归档压缩;如果用户没选择压缩方式则仅归档不压缩;
    #!/bin/bash
    #
    read -p "Please input some files: " FILEPATH
    read -p "Destination archive name: " ARCHIVENAME
    select I in compress gzip bzip2 xz uncompress; do
        case $I in
            compress)
                tar cZf /tmp/$ARCHIVENAME.tar.Z $FILEPATH
                exit
                ;;
            gzip)
                tar czf /tmp/$ARCHIVENAME.tar.gz $FILEPATH
                exit
                ;;
            bzip2)
                tar cjf /tmp/$ARCHIVENAME.tar.bz2 $FILEPATH
                exit
                ;;
            xz)
                tar cJf /tmp/$ARCHIVENAME.tar.xz $FILEPATH
                exit
                ;;
            uncompress)
                tar cf /tmp/$ARCHIVENAME.tar $FILEPATH
                exit
                ;;
        esac
    done


两种特殊文件:
    1.设备文件 (mknod命令可创建设备文件)
        其元数据中原本用来保存数据库块指针的位置,存放的是设备号信息;
    2.符号连接文件
        其元数据中原本用来保存数据块指针的位置,存放的是另一个文件的访问路径;

链接文件:
    链接:将文件的元数据部分和数据部分关联起来的过程;
          访问一个文件的路径
        硬链接:在inode中的数据块指针指向的数据块的链接,称为硬链接;可也以解释为同一个数据块内容的不同数据块指针;
                一个文件的数据内容可以被多个元数据所向,因此可以有多个硬链接;表现为这个文件的数据可以使用不同的路径进行访问;

        硬链接特点:
            1.不能跨文件系统建立硬链接;
            2.不能对目录建立硬链接;
            3.每次对目标文件建立硬链接,其链接计数会自动增加inode引用计数;
        
        符号链接(软链接):
            独立的文件
            用于存储被链接文件的访问路径信息的文件;
        符号链接特点:
            1.可以跨文件系统建立符号链接
            2.目录也可以创建符号链接
            3.通过符号链接查找到被链接文件的数据内容,过程变得更繁琐;因为需要查找两组路径信息;


    ln命令
    在文件之间建立连接
    格式:
    ln [opition] ...[-T] target link-name
    常用选项:
    -s:创建符号链接,如果不加此选项即创建硬链接;
    -v:显示链接建立过程

应用程序发布的版本管理:
    将不同版本的应用程序分别存放于不同的目录中,通过符号链接链接至某个版本的应用程序目录;如果新版应用程序出现问题,只需将符号链接文件链接至以前的某个稳定版本即可实现应用程序回滚;


    vim末行模式中的替换和查找:
        /或?进行模式查找;
        末行命令中的s命令,是进行替换的命令;s是先查找再根据模式进行替换;
        :[address]s/PATTERN/STRING/CONTROL
        [address] : 地址定界符
            1.如果省略则表示光标所在行;
            2.# 该数字所代表的行号
            3.$ 表示当前文档的最后一行;$-1,$-2...倒数第二、三行;
            4.m,n 从第几行到第几行;
            5.m,+n  从第m行开始后n行;
            6./PATTERN/ 被模式匹配到的行
            7./PATTERN1/,/PATTERN2/ 从被模式1匹配到的行开始到被模式2匹配到的行结束;
            8.% 所有行;
        PATTERN:要进行替换的内容必须被PATTERN匹配;
        STRING: 纯字符串,不识别正则表达式的元字符;(替换成什么)
        CONTROL:
            g:当前行内所有匹配的字符全部替换;
            c:手动控制替换操作;


    sed命令
        sed:stream editor,流编辑器
        行编辑操作工具;
        sed在实施文本文件处理时,是以行为单位一个或多个文件进行编辑处理;每次sed会处理给定的文件中的一行内容;

        sed在处理文本文件时,将正在处理的当前行存储到临时的内存缓存区中,称为 模式空间 ;所谓的模式空间是sed命令的主要工作车间;对于缓存的行,使用给定的PATTERN去匹配,如果匹配成功,则使用相应的command进行编辑处理,如果匹配不成功则直接发往标准输出;继续处理下一行直到文档结束;

        默认情况下,sed所处理的文件的内容都是在内存中完成的,并不会影响磁盘上存放的文件的内容;

        sed默认有循环遍历的含义;可以使用sed简化文件的循环遍历操作;

        ---stream editor for filtering and transforming text
        格式:
            sed [OPTION]... 'script‘[inputfile][input-file]...
        常用选项:
            -n:对于不能被PATTERN匹配的行不发送到标准输出;
             -e script, --expression=script:多条件编辑;
             -f script-file, --file=script-file:从指定的文件中读取脚本内容在编辑;
                 注意:script-file最好使用绝对路径指定;
             -i[SUFFIX], --in-place[=SUFFIX]:直接修改原文件内容;
             -r:可以使sed支持扩展正则表达式;

        script:AddressCommand (地址定界+命令)
            Address:地址定界
            1.空地址:表示指定文件的所有行;
            2.单地址:sed对能够匹配该地址的唯一一行进行处理;
                #:表示指定行号
                /PATTERN/:可以被模式匹配到的所有行
                $:表示指定文件的最后一行;不支持$-1
            3.地址范围:
                m,n:m行到n行;(包括m,n行)
                m~n:从m行开始,以n为步长,所经过的所有行;(eg:1~2表示第1,3,5,7...行)
                m,+n:从第m行开始后n行;(包括m行)
                m,~n:从m行开始,向后查找m*n行;(包括m行)
            4./PATTERN1/,/PATTERN2/:
                从被PATTERN1第一次匹配的行开始,到被PATTERN2第一次匹配的行结束;后继续匹配是否有被PATTERN1匹配PATTERN2结束的行;

            Command:命令
            1.=:显示被PATTERN所匹配的行的行号;
            2.a \test :在被模式匹配的行之后追加test内容;支持“\n”换行,从而实现追加多行信息;
            3.i \test :在被模式匹配的行之前插入test内容;支持“\n”换行,从而实现追加多行信息;
            4.c \test :将被模式匹配到的内容修改为test内容,支持“\n”换行,从而实现修改原内容为多行信息;
            5.d :在模式空间中删除被匹配到的行;(不显示被匹配到的行)
                注意:一般在使用d命令时,不建议使用-n选项;否则将没有结果;
            6.p: 将模式空间中被模式匹配的行输出到标准输出;
                注意:一般在使用p命令是建议使用-n选项;
            7.w filename:filename为一个路径;w命令将模式空间中被模式匹配的行存储到指定的文件当中;(相当于另存为)
                注意:一般在使用w命令是建议使用-n选项;
            8.r filename:filename为一个路径;r命令可以将指定的文件内容添加至被PATTERN匹配的行后面;

            !Command:在模式空间中被PATTERN匹配的行不执行指定的命令;相反,没有被PATTERN匹配的行会执行Command;

            s///:查找并替换,分隔符可以更换任意符号,但必须保持一致;
                s/regexp/replacement/[control]
                regexp:正则表达式,也就是PATTERN,计划查找并替换的内容就是能够被regexp匹配的内容;
                replacement:要替换的结果,纯字符串;支持后向引用( s/\(string\)/$/ )| ( s/\(string\)/\1/ )

            高级编辑命令:
                h:将模式空间中的内容存储到保持空间中,并覆盖保持空间中原有内容;
                H:将模式空间中的内容存储到保持空间中,并追加至保持空间中原有内容之后;
                g:从保持空间中取出数据存储到模式空间中,并覆盖模式空间中原有内容;
                G:从保持空间中取出数据存储到模式空间中,并追加至模式空间中原有内容之后;
                x:交换保持空间与模式空间中的内容;
                n:读取被PATTERN匹配的行的下一行,并覆盖到模式空间;
                N:读取被PATTERN匹配的行的下一行,并追加到模式空间;
                D:删除模式空间中的所有行;