• linux下zip/unzip详解


    linux下zip_unzip详解


    命令列表:
    zip
        -q (quiet)
        -r (recursive)
        -0(level0-level9)
        -e (encrypt)
        -u (update)
        -m (move into zipfile delete original-Source files)
        
    unzip
        -d (directory)
        -P (password)
        -x (exclude)
        -o (overwrite)
        -n (never overwrite)
        -l (list archive)
        -t (test compressed archive data)
        -v (list verbosely/show version info)
        -j (junk paths "do not make directories")
        
    扩展:    
    zipcloak
    zipdetails
    zipgrep
    zipinfo
    zipsplit




    环境
    [root@osker ~]# cat /etc/redhat-release
    CentOS Linux release 7.6.1810 (Core)
    [root@osker ~]# uname -r
    3.10.0-957.el7.x86_64

    安装zip、unzip
    [root@osker ~]# yum install -y zip unzip
    [root@osker ~]# rpm -qa zip unzip
    zip-3.0-11.el7.x86_64
    unzip-6.0-20.el7.x86_64





    zip


    如何使用zip压缩一个或多个文件?
    [root@osker ~]# touch test{1..5}.txt
    [root@osker ~]# ll
    total 4
    -rw-------. 1 root root 1392 Apr 19  2019 anaconda-ks.cfg
    -rw-r--r--  1 root root    0 Apr 10 20:10 test1.txt
    -rw-r--r--  1 root root    0 Apr 10 20:10 test2.txt
    -rw-r--r--  1 root root    0 Apr 10 20:10 test3.txt
    -rw-r--r--  1 root root    0 Apr 10 20:10 test4.txt
    -rw-r--r--  1 root root    0 Apr 10 20:10 test5.txt
    #test为压缩后的文件名,后面跟需要压缩的文件。
    [root@osker ~]# zip test test1.txt test2.txt
      adding: test1.txt (stored 0%)
      adding: test2.txt (stored 0%)
    [root@osker ~]# ll
    total 8
    -rw-------. 1 root root 1392 Apr 19  2019 anaconda-ks.cfg
    -rw-r--r--  1 root root    0 Apr 10 20:10 test1.txt
    -rw-r--r--  1 root root    0 Apr 10 20:10 test2.txt
    -rw-r--r--  1 root root    0 Apr 10 20:10 test3.txt
    -rw-r--r--  1 root root    0 Apr 10 20:10 test4.txt
    -rw-r--r--  1 root root    0 Apr 10 20:10 test5.txt
    -rw-r--r--  1 root root  314 Apr 10 20:11 test.zip
    [root@osker ~]# unzip -l test.zip
    Archive:  test.zip
      Length      Date    Time    Name
    ---------  ---------- -----   ----
            0  04-10-2020 20:10   test1.txt
            0  04-10-2020 20:10   test2.txt
    ---------                     -------
            0                     2 files
    [root@osker ~]# file test.zip
    test.zip: Zip archive data, at least v1.0 to extract
            
    以上过程可以看出,zip压缩后,创建的压缩包自动添加.zip



    -q (quiet)
    如果不想压缩的时候显示信息使用-q (quiet) 参数
    [root@osker ~]# zip -q archive.zip test1.txt test2.txt test3.txt
    [root@osker ~]# ll
    total 12
    -rw-------. 1 root root 1392 Apr 19  2019 anaconda-ks.cfg
    -rw-r--r--  1 root root  460 Apr 10 20:17 archive.zip
    -rw-r--r--  1 root root    0 Apr 10 20:10 test1.txt
    -rw-r--r--  1 root root    0 Apr 10 20:10 test2.txt
    -rw-r--r--  1 root root    0 Apr 10 20:10 test3.txt
    -rw-r--r--  1 root root    0 Apr 10 20:10 test4.txt
    -rw-r--r--  1 root root    0 Apr 10 20:10 test5.txt
    -rw-r--r--  1 root root  314 Apr 10 20:11 test.zip

    -r (recursive)
    如果要压缩一个目录,就需要用-r (recursive) 参数
    [root@osker ~]# mkdir dir
    [root@osker ~]# mv test{1..5}.txt dir/
    [root@osker ~]# ll dir
    total 0
    -rw-r--r-- 1 root root 0 Apr 10 20:10 test1.txt
    -rw-r--r-- 1 root root 0 Apr 10 20:10 test2.txt
    -rw-r--r-- 1 root root 0 Apr 10 20:10 test3.txt
    -rw-r--r-- 1 root root 0 Apr 10 20:10 test4.txt
    -rw-r--r-- 1 root root 0 Apr 10 20:10 test5.txt
    [root@osker ~]# zip -r dir.zip dir
      adding: dir/ (stored 0%)
      adding: dir/test1.txt (stored 0%)
      adding: dir/test2.txt (stored 0%)
      adding: dir/test3.txt (stored 0%)
      adding: dir/test4.txt (stored 0%)
      adding: dir/test5.txt (stored 0%)
    [root@osker ~]# ll
    total 16
    -rw-------. 1 root root 1392 Apr 19  2019 anaconda-ks.cfg
    -rw-r--r--  1 root root  460 Apr 10 20:17 archive.zip
    drwxr-xr-x  2 root root   91 Apr 10 20:20 dir
    -rw-r--r--  1 root root  928 Apr 10 20:21 dir.zip
    -rw-r--r--  1 root root  314 Apr 10 20:11 test.zip
    [root@osker ~]# unzip -l dir.zip
    Archive:  dir.zip
      Length      Date    Time    Name
    ---------  ---------- -----   ----
            0  04-10-2020 20:20   dir/
            0  04-10-2020 20:10   dir/test1.txt
            0  04-10-2020 20:10   dir/test2.txt
            0  04-10-2020 20:10   dir/test3.txt
            0  04-10-2020 20:10   dir/test4.txt
            0  04-10-2020 20:10   dir/test5.txt
    ---------                     -------
            0                     6 files


    -(0-9)        
    设置压缩级别,默认压缩级别为-6,-0为只打包不压缩,-9压缩率最高,花费时间久。
    [root@osker ~]# zip -6 -r 6dir.zip dir/
      adding: dir/ (stored 0%)
      adding: dir/test1.txt (stored 0%)
      adding: dir/test2.txt (stored 0%)
      adding: dir/test3.txt (stored 0%)
      adding: dir/test4.txt (stored 0%)
      adding: dir/test5.txt (stored 0%)
    [root@osker ~]# zip -r xdir.zip dir/
      adding: dir/ (stored 0%)
      adding: dir/test1.txt (stored 0%)
      adding: dir/test2.txt (stored 0%)
      adding: dir/test3.txt (stored 0%)
      adding: dir/test4.txt (stored 0%)
      adding: dir/test5.txt (stored 0%)
    [root@osker ~]# ll 6dir.zip xdir.zip
    -rw-r--r-- 1 root root 928 Apr 10 20:27 6dir.zip
    -rw-r--r-- 1 root root 928 Apr 10 20:28 xdir.zip
    可以看出默认为-6压缩级别


    -e (encrypt)
    为压缩包添加密码,使用-e (encrypt) 参数
    [root@osker ~]# zip -e -q edir.zip dir/test1.txt
    Enter password:
    Verify password:
    [root@osker ~]# ll edir.zip
    -rw-r--r-- 1 root root 204 Apr 10 20:31 edir.zip
    [root@osker ~]# unzip edir.zip
    Archive:  edir.zip
    [edir.zip] dir/test1.txt password:
    replace dir/test1.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
     extracting: dir/test1.txt


    -u (update): only changed or new files
    需要追加文件到压缩包时,需要使用-u参数
    [root@osker ~]# zip an.zip -u test1.txt
      adding: test1.txt (stored 0%)


    -m (move into zipfile delete original-Source files)  
    [root@osker ~]# zip an.zip -u test1.txt
      adding: test1.txt (stored 0%)
    [root@osker ~]# ll
    total 8
    -rw-------. 1 root root 1392 Apr 19  2019 anaconda-ks.cfg
    -rw-r--r--  1 root root 1080 Apr 10 21:33 an.zip
    -rw-r--r--  1 root root    0 Apr 10 21:32 test1.txt
    [root@osker ~]# zip -m test.zip test1.txt
      adding: test1.txt (stored 0%)
    [root@osker ~]# ll
    total 12
    -rw-------. 1 root root 1392 Apr 19  2019 anaconda-ks.cfg
    -rw-r--r--  1 root root 1080 Apr 10 21:33 an.zip
    -rw-r--r--  1 root root  168 Apr 10 21:37 test.zip
    可以发现压缩后test1.txt文件没有了






     
    unzip

    解压缩,默认解压到当前目录
    [root@osker ~]# unzip test.zip
    Archive:  test.zip
     extracting: test1.txt               
     extracting: test2.txt               
    [root@osker ~]# ll
    total 12
    -rw-------. 1 root root 1392 Apr 19  2019 anaconda-ks.cfg
    drwxr-xr-x  2 root root   91 Apr 10 20:31 dir
    -rw-r--r--  1 root root  204 Apr 10 20:31 edir.zip
    -rw-r--r--  1 root root    0 Apr 10 20:10 test1.txt
    -rw-r--r--  1 root root    0 Apr 10 20:10 test2.txt
    -rw-r--r--  1 root root  314 Apr 10 20:11 test.zip

    -d (directory)
    解压到指定目录,使用-d (directory) 参数
    [root@osker ~]# unzip test.zip -d /opt
    Archive:  test.zip
       creating: /opt/dir/
     extracting: /opt/dir/test2.txt      
     extracting: /opt/dir/test3.txt      
     extracting: /opt/dir/test4.txt      
     extracting: /opt/dir/test5.txt      
     extracting: /opt/dir/test1.txt      
    [root@osker ~]# ll /opt/dir/
    total 0
    -rw-r--r-- 1 root root 0 Apr 10 20:10 test1.txt
    -rw-r--r-- 1 root root 0 Apr 10 20:10 test2.txt
    -rw-r--r-- 1 root root 0 Apr 10 20:10 test3.txt
    -rw-r--r-- 1 root root 0 Apr 10 20:10 test4.txt
    -rw-r--r-- 1 root root 0 Apr 10 20:10 test5.txt

    -P (password)
    解压加密的压缩包时,不想使用交互式,可以使用-P (password)参数
    [root@osker ~]# unzip -P 1 edir.zip      #密码为1
    Archive:  edir.zip
     extracting: dir/test1.txt

    -x (exclude)
    解压时候,需要排除某个文件不解压,使用-x (exclude)参数
    [root@osker ~]# unzip test.zip -x dir/test1.txt
    Archive:  test.zip
       creating: dir/
     extracting: dir/test2.txt           
     extracting: dir/test3.txt           
     extracting: dir/test4.txt           
     extracting: dir/test5.txt

    -o (overwrite)
    当解压的文件提示需要覆盖确认的时候,可以使用-o参数,不提示直接覆盖。
    [root@osker ~]# unzip test.zip
    Archive:  test.zip
    replace dir/test2.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
     extracting: dir/test2.txt           
     extracting: dir/test3.txt           
     extracting: dir/test4.txt           
     extracting: dir/test5.txt           
     extracting: dir/test1.txt           
    [root@osker ~]# unzip -o test.zip
    Archive:  test.zip
     extracting: dir/test2.txt           
     extracting: dir/test3.txt           
     extracting: dir/test4.txt           
     extracting: dir/test5.txt           
     extracting: dir/test1.txt

     
    -n (never overwrite)
    解压目标目录中没有的文件
    [root@osker ~]# unzip -n test.zip
    Archive:  test.zip
     extracting: dir/new.txt
     
     
    -l (list archive)
     不解压查看压缩包使用-l参数
     [root@osker ~]# unzip -l edir.zip
    Archive:  edir.zip
      Length      Date    Time    Name
    ---------  ---------- -----   ----
            0  04-10-2020 20:10   dir/test1.txt
    ---------                     -------
            0                     1 file


    -t (test compressed archive data)
    测试压缩包有无损坏
    [root@osker ~]# unzip -t an.zip
    Archive:  an.zip
        testing: anaconda-ks.cfg          OK
        testing: test1.txt                OK
    No errors detected in compressed data of an.zip.        
            
            
    -v (list verbosely/show version info)
    列出压缩包里的详细信息
    [root@osker ~]# unzip -v an.zip
    Archive:  an.zip
     Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
    --------  ------  ------- ---- ---------- ----- --------  ----
        1392  Defl:N      754  46% 04-19-2019 12:22 60a52de9  anaconda-ks.cfg
           0  Stored        0   0% 04-10-2020 21:32 00000000  test1.txt
    --------          -------  ---                            -------
        1392              754  46%                            2 files
    [root@osker ~]# ll
    total 12
    -rw-------. 1 root root 1392 Apr 19  2019 anaconda-ks.cfg
    -rw-r--r--  1 root root 1080 Apr 10 21:33 an.zip
    -rw-r--r--  1 root root  168 Apr 10 21:37 test.zip


    -j (junk paths "do not make directories")
    解压时候不生成目录
    [root@osker ~]# unzip -l dir.zip
    Archive:  dir.zip
      Length      Date    Time    Name
    ---------  ---------- -----   ----
            0  04-10-2020 21:47   dir/
            0  04-10-2020 21:47   dir/test1.txt
            0  04-10-2020 21:47   dir/test2.txt
            0  04-10-2020 21:47   dir/test3.txt
    ---------                     -------
            0                     4 files
    [root@osker ~]# unzip -j dir.zip
    Archive:  dir.zip
     extracting: test1.txt               
     extracting: test2.txt               
     extracting: test3.txt               
    [root@osker ~]# ll
    total 8
    -rw-------. 1 root root 1392 Apr 19  2019 anaconda-ks.cfg
    drwxr-xr-x  2 root root   57 Apr 10 21:47 dir
    -rw-r--r--  1 root root  620 Apr 10 21:47 dir.zip
    -rw-r--r--  1 root root    0 Apr 10 21:47 test1.txt
    -rw-r--r--  1 root root    0 Apr 10 21:47 test2.txt
    -rw-r--r--  1 root root    0 Apr 10 21:47 test3.txt        
            
            
            
            
    zipcloak
    有时候压缩文件的时候忘记添加密码,可以使用zipcloak命令追加密码。
    [root@osker ~]# zipcloak test.zip
    Enter password:
    Verify password:
    encrypting: dir/
    encrypting: dir/test2.txt
    encrypting: dir/test3.txt
    encrypting: dir/test4.txt
    encrypting: dir/test5.txt
    encrypting: dir/test1.txt
    encrypting: dir/new.txt


    zipdetails
    可能需要安装此包
    [root@osker ~]# yum install -y perl-IO-Compress
    查看zip包详细属性
    [root@osker ~]# zipdetails an.zip
    0000 LOCAL HEADER #1       04034B50
    0004 Extract Zip Spec      14 '2.0'
    0005 Extract OS            00 'MS-DOS'
    0006 General Purpose Flag  0000
         [Bits 1-2]            0 'Normal Compression'
    0008 Compression Method    0008 'Deflated'
    000A Last Mod Time         4E9362D7 'Fri Apr 19 12:22:46 2019'
    000E CRC                   60A52DE9
    0012 Compressed Length     000002F2
    0016 Uncompressed Length   00000570
    001A Filename Length       000F
    001C Extra Length          001C
    001E Filename              'anaconda-ks.cfg'
    ......

    zipgrep
    过滤压缩包的内容
    [root@osker ~]# zipgrep root  an.zip
    anaconda-ks.cfg:rootpw --iscrypted $6$4MbbflESaQBP8rLd$zgLUIfBs9zgnNkeDfA5G67PKjt7rdf.Z/ChB59kgYw.7804KH2hiXCL1SXcCjaMrHceZcRvSN2yVcst/D/qGL/
    anaconda-ks.cfg:pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty          
    [root@osker ~]# grep 'root' anaconda-ks.cfg
    rootpw --iscrypted $6$4MbbflESaQBP8rLd$zgLUIfBs9zgnNkeDfA5G67PKjt7rdf.Z/ChB59kgYw.7804KH2hiXCL1SXcCjaMrHceZcRvSN2yVcst/D/qGL/
    pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
    可以看到和grep出来的结果是一样的。


    zipinfo
    查看压缩包里文件的详细属性
    [root@osker ~]# zipinfo test.zip
    Archive:  test.zip
    Zip file size: 1162 bytes, number of entries: 7
    drwxr-xr-x  3.0 unx        0 Bx stor 20-Apr-10 20:58 dir/
    -rw-r--r--  3.0 unx        0 Bx stor 20-Apr-10 20:10 dir/test2.txt
    -rw-r--r--  3.0 unx        0 Bx stor 20-Apr-10 20:10 dir/test3.txt
    -rw-r--r--  3.0 unx        0 Bx stor 20-Apr-10 20:10 dir/test4.txt
    -rw-r--r--  3.0 unx        0 Bx stor 20-Apr-10 20:10 dir/test5.txt
    -rw-r--r--  3.0 unx        0 Bx stor 20-Apr-10 20:10 dir/test1.txt
    -rw-r--r--  3.0 unx        0 Bx stor 20-Apr-10 20:58 dir/new.txt
    7 files, 0 bytes uncompressed, 0 bytes compressed:  0.0%


    zipsplit
    将压缩包切分为多个小包
    [root@osker ~]# ll -h
    -rw-r--r--  1 root root 1.2K Apr 10 21:03 test.zip
    [root@osker ~]# zipsplit -n 1024 test.zip
    2 zip files will be made (100% efficiency)
    creating: test1.zip
    creating: test2.zip
    [root@osker ~]# ll test*
    -rw-r--r-- 1 root root 1000 Apr 10 21:16 test1.zip
    -rw-r--r-- 1 root root  184 Apr 10 21:16 test2.zip
    -rw-r--r-- 1 root root 1162 Apr 10 21:03 test.zip





  • 相关阅读:
    HDOJ 450题留念
    有关VIM的一些笔记
    hdu 2715
    POJ 1004
    链表的创建,添加结点,打印...
    C++ 静态数据成员小谈
    自定义String类
    sizeof/strlen小论
    多态之重载多态运算符重载那些事
    01背包问题
  • 原文地址:https://www.cnblogs.com/osker/p/12676464.html
Copyright © 2020-2023  润新知