linux-应用-压缩与解压小结

本文全面介绍了Linux环境下常用的压缩与解压工具及其使用方法,包括compress、gzip、bzip2、tar、zip、rar等多种工具,适用于不同场景的需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                             linux下的压缩与解压

摘要:主要说明在linux下的常用的压缩和解压程序的用法。

    在压缩指令中最早的要算是compress了,但现在它基本上不是预设的压缩指令了。
    后来被gzip和bzip代替了,而这两位兄弟只能把文件一个一个的压缩,
    有时我们需要把一大堆的文件压缩成一个包时,就不方便了。而tar本身是没有压缩功能的,
    它只有打包的功能,就是把一堆文件打在一起,如果要压缩的话需要借助gzip,bzip等压缩程序。
    不过现在的tar把这些压缩软件加在了自身中,只要加上参数就可以解压。


compress    (.Z)
    如果看到.Z文件,就是用compress压缩而来的。

# compress [-dcr] 档案或目录
參數:
-d  :解压
-r  :压缩目录
-c  :解压到标准输出

例子:
#compress data.txt          #data.txt.Z
#compress -d data.txt.Z     #解压后得到data.txt
#compress -c data.txt > data.txt.back.Z     #把文件压缩到另一个文件做备份而不用默认文件

====================================================

gzip, zcat, gunzip

    如果看到以.gz结尾的文件,那么就是gzip压缩而来的。
#gzip [-cdtlr#f] filename

#gunzip [-ctlrf] file.gz (.gz, -gz, .z, -z, _z or .Z , .tgz, tar.Z ,tar.gz)

#zcat [-hf] file.gz (相当于 gzip -c)

参数:
    -c : 把压缩/解压后的文件内容输出到标准输出
    -d : 解压
    -t : 检查压缩包是否有错误
    -l : 显示压缩率
    -r : 进入子目录进行压缩
    -# : 指定压缩等级-1最快,-9 最慢但最好
    -f : 如果被压缩的文件存在,将不提示用户,直接强迫覆盖


例子:
-----------------------------------------------------------
#gzip -c file > file.back.gz        #原文件不变,生成一个gz的备份文件
#gzip file                          #生成file.gz 原文件被覆盖
#gzip -d file.back.gz               #解压得到file.back
#gunzip file.back.gz                #解压得到file.back
#gzip -9 -c file > file.back.gz     #用最好的压缩率压缩
#gzip -r dirname                    #得到的将是每个文件下的各个文件的.gz文件
[zhengxh@hoverzg aa]$ gzip -r aa
[zhengxh@hoverzg aa]$ ls
bb  cc  cc.back

[zhengxh@hoverzg aa]$ ls bb/*
bb/bb.gz

bb/ee:
ee.gz
[zhengxh@hoverzg stdshell]$ cd aa
[zhengxh@hoverzg aa]$ gzip -l -r .
         compressed        uncompressed  ratio uncompressed_name
                 44                  76  69.7% ./bb/ee/ee
                 39                  62  71.0% ./bb/bb
[zhengxh@hoverzg aa]$ ls
bb  cc  cc.back  cc.back.gz
[zhengxh@hoverzg aa]$ zcat cc.back.gz
14052207006 | 2007-12-11 12:33:30.093594 | 8 days 03:28:08.571074
...

----------------------------------------------------------------

====================================================

bzip2, bzcat
    如何有文件以.bz, .bz2, .tbz, .tbz2, .bz2结尾的,就可以用bzip2来进行解压/压缩。
    其语法如下:
    bzip2 [ -cdfkstz123456789 ] [ filenames ...  ]
    bunzip2 [ -fkc ] [ filenames ...  ]
    bzcat [ -s ] [ filenames ...  ]

   -d        解压(相当于bunzip2)
   -z        压缩
   -k        不删除原来的文件,生成一个新的压缩文件
   -f        强制执行
   -t        检查文件的完整性
   -c        把压缩/解压后的内容输出到标准输出
   -s                  减少内存的使用
   -1 .. -9            压缩率
   --fast              相当于 -1
   --best              相当于 -9


例子:
----------------------------------------------------------------
[zhengxh@hoverzg aa]$ bzip2 -k cc
[zhengxh@hoverzg aa]$ ls
bb  cc  cc.back.gz  cc.bz2

[zhengxh@hoverzg aa]$ bzip2 -z cc
[zhengxh@hoverzg aa]$ ls
bb  cc.back.gz  cc.bz2

[zhengxh@hoverzg aa]$ bzip2 -dc cc.bz2
14052207006 | 2007-12-11 12:33:30.093594 | 8 days 03:28:08.571074
...

[zhengxh@hoverzg aa]$ bunzip2 -c cc.bz2
14052207006 | 2007-12-11 12:33:30.093594 | 8 days 03:28:08.571074
...

[zhengxh@hoverzg aa]$ bzip2 -9 -c cc > cc.back.bz2
[zhengxh@hoverzg aa]$ ls
cc  cc.back.bz2

[zhengxh@hoverzg aa]$ bunzip2 -d -c cc.back.bz2
14052207006 | 2007-12-11 12:33:30.093594 | 8 days 03:28:08.571074
...

[zhengxh@hoverzg aa]$ bzcat -s cc.back.bz2
14052207006 | 2007-12-11 12:33:30.093594 | 8 days 03:28:08.571074
...

--------------------------------------------------------------

====================================================

tar   
    tar 本身没有压缩的功能,它的作用是把一大堆的文件打包。
    但通过不同的参数它可以调用其他的压缩程序比如说:bzip2/gzip等,是的现在它也具有压缩功能。
    它的参数比较多,让我慢慢道来:

tar [OPTION...] [FILE]...

主操作选项:
  -c, --create               创建
  -x, --extract              解开一个备份包
  -t, --list                 查看tarfile里的文件列表
注意: 以上三个参数只能有一个,因为不能同时解压和压缩呀!
  -r, --append               向(.tar)包追加一个文件
文件格式选项:
  -j, --bzip2                是否同時具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?
  -z, --gzip                 是否同時具有 gzip 的属性?亦即是否需要用 gzip压缩?
  -Z, --compress             是否同時具有 compress 的属性?亦即是否需要用 compress压缩?

  -f, --file                 注意,在f之后要立即接压缩包的文件名!不要再加参数!
文件属性:
  -p, --perseve              保留文件原来的属性
  -v                         显示处理过程
文件位置:
  -C, --directory=DIR        改变到文件此目录
  -P, --absolute-names       使用绝对路径来压缩/解压压缩包
  -N, New                    比後面接的日期(yyyy/mm/dd)還要新的才會被打包進新建的檔案中!
  -X, --exclude-from=FILE    排除出和FILE匹配的文件


--------------------------------------------------------------
例子:
[zhengxh@hoverzg stdshell]$ tar -cvf tt.tar /etc    #打包不压缩
[zhengxh@hoverzg stdshell]$ tar -rvf tt.tar myfile  #向原来包中增加一个文件
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc      #打包后,以 gzip压缩
[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc     #打包后,以 bzip2压缩

#解压到指定目录
[zhengxh@hoverzg stdshell]$ tar zxvfC data.tar.gz ./mydir/

#查看压缩包里有哪些文件
[zhengxh@hoverzg stdshell]$ tar zvtf data.tar.gz
-rw-r--r-- zhengxh/cvs     115 2007-10-15 15:57:52 data.txt

#把tt目录内的内容压缩到aa目录里
[zhengxh@hoverzg aa]$ tar zcvf tt.tar.gz ../tt/*
tar: 从成员名中删除开头的“../”
../tt/1.cpp
../tt/aa.gz
../tt/bb/
[zhengxh@hoverzg aa]$ tar ztvf tt.tar.gz
-rw-r--r-- zhengxh/cvs     188 2008-06-13 19:06:16 tt/1.cpp
-rw-rw-r-- zhengxh/cvs      23 2007-04-10 23:45:39 tt/aa.gz
drwxr-xr-x zhengxh/cvs       0 2008-01-06 00:52:52 tt/bb/

#只解压压缩包中的一个文件/目录
[zhengxh@hoverzg aa]$ tar -zxvf tt.tar.gz tt/1.cpp(tt/bb)
tt/1.cpp

#使用绝对路径
tar zcvfP data.tar.gz ./mydir/
tar zxvfP data.tar.gz           #这里将自动解压到mydir目录中

#在 /home 中,比 2005/06/01 新的文件才备份
[root@linux ~]# tar -N '2005/06/01' -zcvf home.tar.gz /home

#我要备份 /home, /etc ,但不要 /home/dmtsai
#注意:这里的-X后面的目录或文件必须存在
[root@linux ~]# tar -X /home/dmtsai -zcvf myfile.tar.gz /home/* /etc

#tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z mydir


--------------------------------------------------------------

====================================================

zip, unzip  (.zip)
    这个程序在windows下也可以使用

    zip [-er]  filename ...

    -e  加密,会提示你输入密码,并确认
    -r  轮训整个目录

例子:
---------------------------------------------
[zhengxh@hoverzg stdshell]$ zip -re tt.zip mydir

[zhengxh@hoverzg stdshell]$ unzip tt.zip

---------------------------------------------

====================================================

    rar [-aexd] -[[h]p] file.rar file...
    rar [-exd]  []
               <@listfiles...> <path_to_extract/>
    rar 主要是针对.rar文件,当然如果是.zip文件也可以。主要的参数有:

[主命令选项]
    -a          添加/创建一个.rar备份文件
    -e          解压到当前目录
    -x          解压到当前目录保持目录结构,e不保持目录结构
    -d          从压缩包中删除文件
    -l          查看压缩的文件列表
    -c          添加压缩包的说明
[辅助选项]
    -p          给压缩包加密
    -hp         连同数据一起加密
    -k          锁定压缩包,之后该包就不能被修改了

例子:
---------------------------------------------
#创建一个rar备份包
[zhengxh@hoverzg stdshell]$ rar a data.rar data.txt

#添加一个压缩包到原来的rar
[zhengxh@hoverzg stdshell]$ rar a data.rar test.c

#从rar包删除一个文件
[zhengxh@hoverzg stdshell]$ rar d data.rar test.c

#查看压缩包中的文件列表
[zhengxh@hoverzg stdshell]$ rar l data.rar

#创建一个压缩包,并把整个目录下的文件一起压缩,并要验证密码
[zhengxh@hoverzg stdshell]$ rar a tt.rar tt/ -p
Enter password (will not be echoed):
Reenter password:

#把数据也一起加密
[zhengxh@hoverzg stdshell]$ rar a tt.rar tt/ -hp

---------------------------------------------

rar请到:http://www.rarsoft.com/download.htm 下载!

====================================================

    lha  (.lha)

    解压:lha -e FileName.lha
    压缩:lha -a FileName.lha FileName

    请到:Http://www.infor.kanazawa-it.ac.jp/~ishii/lhaunix/下载!
---------------------------------------------

====================================================

    cpio [OPTION...] [destination-directory]
    通过重定向的方式把压缩包进行输入/输出。可以解压的文件有.rpm, .tar等

[主选项]
    -o :创建:将文件输出到档案或装置上 (output mod)
    -i :将数据自档案或装置copy出来到系统当中 (input mode)
    -t :查看 cpio 建立的档案或装置的内容
    -c :一种较新的 portable format 方式储存
    -v :让储存的过程中文件名称可以在屏幕上显示
    -B :让预设的 Blocks 可以增加至 5120 bytes ,预设是 512 bytes !
       这样的好处是可以让大档案的储存速度加快(请参考 i-nodes 的观念)
    -d :自动建立目录!由于 cpio 的内容可能不是在同一个目录内,
         如此的话在反备份的过程会有问题! 这个时候加上 -d 的话,
         就可以自动的将需要的目录建立起来了!
    -u :自动的将较新的档案覆盖较旧的档案!


例子:
---------------------------------------------
    #将搜寻到的档案存到磁带机
    [root @test /root]# find / -print | cpio -covB > /dev/st0

    #将磁带机的数据还原回来
    [root @test /root]# cpio -icduv < /dev/st0

    #按照rpm包本身的目录结构解压rpm文件
    [root @test /root]# rpm2cpio FileName.rpm | cpio -div

---------------------------------------------
补充:

如何不安装但是获取rpm包中的文件
使用工具rpm2cpio和cpio
rpm2cpio xxx.rpm | cpio -vi
rpm2cpio xxx.rpm | cpio -idmv
rpm2cpio xxx.rpm | cpio --extract --make-directories
参数i和extract相同,表示提取文件。v表示指示执行进程
d和make-directory相同,表示根据包中文件原来的路径建立目录
m表示保持文件的更新时间。

====================================================

    ar (.deb)

    解包:ar p FileName.deb data.tar.gz | tar zxf -

====================================================

    用法:dd [选项]...
    dd if="input_file" of="output_file" bs="block_size" count="number"
    复制文件,并根据以下的选项将数据转换和格式化。

      bs=字节         强迫 ibs=<字节> 及 obs=<字节>
      cbs=字节        每次转换指定的<字节>
      conv=关键字     根据以逗号分隔的关键字表示的方式来转换文件
      count=块数目    只复制指定<块数目>的输入数据
      ibs=字节        每次读取指定的<字节>
      if=文件         读取<文件>内容而非标准输入的数据
      obs=字节        每次写入指定的<字节>
      of=文件         将数据写入<文件>而不在标准输出显示
      seek=块数目     先略过以 obs 为单位的指定<块数目>的输出数据
      skip=块数目     先略过以 ibs 为单位的指定<块数目>的输入数据

[以下例子来自鸟哥私房菜(http://linux.vbird.org/)]
    例一:將 /etc/passwd  备份到 /tmp/passwd.back 中
    [root@linux ~]# dd if=/etc/passwd of=/tmp/passwd.back
    3+1 records in
    3+1 records out
    [root@linux ~]# ll /etc/passwd /tmp/passwd.back
    -rw-r--r--  1 root root 1746 Aug 25 14:16 /etc/passwd
    -rw-r--r--  1 root root 1746 Aug 29 16:57 /tmp/passwd.back
    # 我的 /etc/passwd 文件大小为 1746 bytes,因为我没有设定 bs ,
    # 所以预设是 512 bytes 為一個單位,因此,上面那個 3+1 表示有 3 個完整的
    # 512 bytes,以及未滿 512 bytes 的另一個 block 的意思啦!
    # 事實上,感覺好像是 cp 這個指令啦~

    範例二:備份 /dev/hda 的 MBR
    [root@linux ~]# dd if=/dev/hda of=/tmp/mbr.back bs=512 count=1
    1+0 records in
    1+0 records out
    # 這就得好好瞭解一下囉~我們知道整顆硬碟的 MBR 為 512 bytes,
    # 就是放在硬碟的第一個 sector 啦,因此,我可以利用這個方式來將
    # MBR 內的所有資料都紀錄下來,真的很厲害吧! ^_^

    範例三:將整個 /dev/hda1 partition 備份下來。
    [root@linux ~]# dd if=/dev/hda1 of=/some/path/filename
    # 這個指令很厲害啊!將整個 partition 的內容全部備份下來~
    # 後面接的 of 必須要不是在 /dev/hda1 的目錄內啊~否則,怎麼讀也讀不完~
    # 這個動作是很有效用的,如果改天你必須要完整的將整個 partition 的內容填回去,
    # 則可以利用 dd if=/some/file of=/dev/hda1 來將資料寫入到硬碟當中。
    # 如果想要整個硬碟備份的話,就類似 Norton 的 ghost 軟體一般,
    # 由 disk 到 disk ,嘿嘿~利用 dd 就可以啦~厲害厲害!

    你可以說, tar 可以用來備份關鍵資料,而 dd 則可以用來備份整顆 partition 或 整顆 disk ,
    很不錯啊~不過,如果要將資料填回到 filesystem 當中, 
    可能需要考慮到原本的 filesystem 才能成功啊!

====================================================

其他压缩相关操作:

#Linux下怎么实现分卷压缩?
    答:用tar命令每卷5M分卷压缩,命令如下:
    tar分卷压缩:tar cvzpf - somedir | split -d -b 5M
    tar多卷合并:cat x* > mytarfile.tar.gz


#压缩传输文件或目录(FunBSD)
    传输到远程:tar czf - www | ssh server "tar zxf -"
    压缩到远程:tar czf - www | ssh server "cat > www.tar.gz"
    解压到远程:ssh server "tar zxf -" < www.tar.gz
    解压到本地:ssh server "cat www.tar.gz" | tar zxf -

---------------------------------------------

先总结这么多,如果有新的体会,再往后加把!

====================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值