UP | HOME

tar命令详细功能和格式—ar解压缩deb文件

1 各种格式介绍

常见打包压缩文件

  • windows *.rar, *.zip, *.7z
  • Linux *.tar, *.tar.gz, *.tar.bz2,***.tar.Xz, *.gz, *.bz2, Xz ,ar

其中的.tar是Unix和类Unix(linux)系统上的归档打包工具 可以将多个文件合并为一个文件 打包后的文件名亦为“XXX.tar”.代表未压缩的tar文件 已压缩的tar文件则附加数据压缩格式的扩展名 如经过gzip压缩后的tar文件,扩展名为“.tar.gz” 由于受到DOS8.3文件名格式的限制,常用的压缩格式使用下列缩写:

.tgz和.tar.gz tar调用gzip来完成打包和压缩的格式
.tbz和.tar.bz2 tar调用bzip2来完成打包和压缩的格式
.taz和.tar.Z tar调用compress来完成打包和压缩的格式
.tar 没有经过压缩的打包文件
.zip zip压缩格式
rar rar格式
7z 用7zip软件压缩的格式
Xz 用Xz软件解压缩
Z compress压缩
ar 可以解压缩.deb文件

2 各种格式解压操作

2.1 .tar文件命令示例

tar -cvf home_backup.tar * #------>可以将当前目录下的所有文件打包进home_backup.tar文件中,后面的是文件也可以是目录 
tar -tvf home_backup.tar #----->列出home_backup.tar文件里已被打包的文件 
tar -xvf home_backup.tar ./home #----->在当前目录的home子目录下下解压home_back.tar 
tar -xvf home_backup.tar home/test.c #----->指定解压出test.c这个文件。解压过程中会自动创建home这个子目录。 
tar -uvf home_backup.tar test.txt #------>更新(覆盖替换)包中的,test.txt文件  
tar -rvf home_backup.tar test.txt #------>将test.txt文件添加到包中

*解压后的文件,其访问权限得到保留;其所有者是执行tar命令的用户,如果tar的执行者是root,则所有者是文件原来的所有者。

2.2 .tgz/tar.gz文件命令示例

tar -zcvf home_backup.tar.gz /home #---->可以将/home目录下的所有文件打包并用gzip压缩入home_backup.tar.gz文件中.
tar -zcvf home_backup.tar.gz * #------>可以将当前目录下的所有文件打包并用gzip压缩进home_backup.tar.gz文件中. 
tar -ztvf home_backup.tar.gz #------>列出home_backup.tar.gz文件里已被打包的文件 
tar -zxvf home_backup.tar.gz ./home #------>在当前目录的home子目录下下解压home_back.tar.gz。 
tar -zxvf home_backup.tar.gz home/test.c #------>指定解压出test.c这个文件。解压过程中会自动创建home这个子目录。

* 总之tar调用gzip就是在选项加一个  z  来解决语句与tar格式都是一样的

2.3 .tbz/tar.bz2文件命令示例

tar -jcvf home_backup.tar.bz2 /home #------>可以将/home目录打包并用bzip2压缩入home_backup.tar.bz2文件中. 
tar -jcvf home_backup.tar.bz2 * #------>可以将当前目录下的所有文件打包并用bzip2压缩进home_backup.tar.bz2文件中. 
tar -jtvf home_backup.tar.bz2 #------>列出home_backup.tar.bz2文件里被打包的文件名,权限,所有者,大小,时间,等信息.否则只显示文件名
. tar -jxvf home_backup.tar.bz2 ./home #------>在当前目录的home子目录下下解压home_back.tar.bz2。
 tar -jxvf home_backup.tar.bz2 home/test.c #------>指定解压出test.c这个文件。解压过程中会自动创建home这个子目录。
  1. tar调用bzip2就是在选项中加一个小写  j  来解决,注意,由于部分老版本的tar使用-I实现本功能,因此,编写脚本时,最好使用–bzip2。

    tar.z/taz文件相关命令示例

    tar -cZvf home_backup.tar.Z /home------>可以将/home目录打包并用compress压缩入home_backup.tar.Z文件中
    .tar -xZvf home_backup.tar.Z ------>在当前目录解压缩home_backup.tar.Z
    

    *tar调用compress就是在语句中加入大写的Z

2.4 .rar和.zip文件命令示例

unzip home_backup.zip #------>解压缩该压缩文件
zip txt_backup.zip *.txt #------>将文件夹内所有txt文件打包为txt_backup.zip文件
unrar e home_backup.rar #------>解压缩该文件夹
rar a txt_backup *.txt #------>将文件夹内所有txt文件打包为txt_backup.rar文件(自动添加后缀)
  1. 由于rarlinux是收费软件,所以我们首先要下载rarlinux,然后安装它.安装方法:现在下载rarlinux的包,官方网址是:www.rarsoft.com
    tar -zxvf rarlinux.tar.gz
    cd ./rarlinux
    make && make install
    

    有的发行版没有预装zip,unzip需要手动安装,一般debian和ubuntu安装很简单.也可以手动安装,选项也很多,最好是man一下.

    apt-get install zip unzip
    
  2. gbkunzip解压缩zip文件-—>解决解压zip乱码问题

    原文链接

    由于Windows下的文件名为GBK编码,而linux一般为UTF-8,因此当解压在Windows上生成的zip文件后,会发现解压出来的文件都是乱码的.

    网上有个解决方法是使用 unzip 的 -O 选项来指定编码格式,然而不知道为何,我在archlinux下的unzip并没有这个选项.

    好在找到了一个 gbkunzip 脚本,可以解决这个问题.

    在archlinux上,可以通过yaourt来安装 gbkunzip

    yaourt -S gbkunzip
    

    安装后,直接执行 gbkunzip zip文件 就行了.

    gbkunzip实际上就是一段python代码,它其实就是对 gbzip module中 ZipFile 类的一个封装.

    cat $(whereis gbkunzip |awk '{print $2}')
    
    #!/usr/bin/env python3
    # fileencoding=utf-8
    
    '''
    解压 zip 文件,其中的文件名是 GB18030 编码,但系统是 Unicode 编码
    '''
    
    import sys
    import os
    from gbzip import ZipFile
    from getpass import getpass
    
    def main():
      try:
        z = ZipFile(sys.argv[1])
        while True:
          try:
            z.extractall()
          except RuntimeError: # encrypted zipfile
            passwd = getpass('Enter correct password: ').encode()
            z.setpassword(passwd)
          else:
            break
        print('Everything is ok.')
      except IndexError:
        sys.exit('give me exactly one zipfile to extract.')
    
    if __name__ == '__main__':
      main()
    
    

2.5 7zip和7z文件命令示例

yum install p7zip #------>Redhat、Fedora、Centos安装命令
apt-get install p7zip #------>Debian、Ubuntu安装命令
7za x home_backup.7z #------>解压缩文件  
7za a -r txt_backup.7z *.txt #----->压缩文件

2.6 tar.Xz文件压缩操作指南

xz -d home_backup.tar.Xz #------>首先解压缩Xz文件然后第二部再解包.tar文件
tar xvf home_backup.tar #------>第二部解包.tar文件

*tar.Xz文件可分成两部解压, 有的教程也说可以直接-xvjf来解压 Xz文件压缩命令的选项是xz -z,有兴趣的大家可以man一下.这个压缩方式压缩率很厉害.

2.7 .gz,.bz2,.Z文件压缩解压操作

#.gz文件
gzip -d home_backup.gz #------>解压缩
gunzip home_backup.gz #------>压缩
#.bz2文件
bzip2 -d home_backup.bz2 #------>解压缩
bunzip2 home_backup.bz2 #------>压缩
#.Z文件
uncompress home_backup.Z #------>解压缩
compress home_backup.Z #------>压缩

2.8 ar解压缩–>deb文件的格式

一个 deb 包其实就是一个ar格式的打包文件. 可以用 ar 命令解开 deb 包.

debdir=/tmp/sl
mkdir -p $debdir
debfile=$debdir/sl.deb
if ! [[ -f $debfile ]];then
    wget http://mirrors.kernel.org/ubuntu/pool/restricted/s/sl-modem/sl-modem-daemon_2.9.11~20110321-12_i386.deb -O $debfile
fi
ar -x $debfile
ls $debdir

control.tar.gz
data.tar.xz
debian-binary
sl.deb

解开后,会发现 deb 包中包含了三个文件:

  1. debian-binary – 这是个文本文件,指明deb包格式的版本号.
  2. control.tar.gz – 这个压缩文件中包含了md5验证码,并且包含了安装package时的一些配置信息.
  3. data.tar.xz – 这个压缩文件中包含的是所有会安装到系统中的文件.

3 tar详细功能和格式

可以将代表功能和选项的单个字母合并;当使用单个字母时,可以不用在字母前面加“-” 某些版本的tar要求严格按照功能字、选项字的顺序,而有些版本的tar并不在意这个顺序。

  • 功能
    • -c,–create 创建新的tar文件
    • -x,–extract,–get 解开tar文件
    • -t,–list 列出tar文件中包含的文件的信息
    • -r,–append 附加新的文件到tar文件中
    • -u,–update 用已打包的文件的较新版本更新tar文件
    • -A,–catenate,–concatenate 将tar文件作为一个整体追加到另一个tar文件中
    • -d,–diff,–compare 将文件系统里的文件和tar文件里的文件进行比较
    • –delete 删除tar文件里的文件。注意,这个功能不能用于已保存在磁带上的tar文件!
  • 常用选项
    • -v,–verbose 列出每一步处理涉及的文件的信息,只用一个“v”时,仅列出文件名,使用两个“v”时,列出权限、所有者、大小、时间、文件名等信息。
    • -k,–keep-old-files 不覆盖文件系统上已有的文件
    • -f,–file 文件名 指定要处理的文件名。可以用“-”代表标准输出或标准输入。
    • -P,–absolute-names 使用绝对路径
    • -j,–bzip2 调用bzip2执行压缩或解压缩。
    • -J,–xz,–lzma 调用XZ Utils执行压缩或解压缩。依赖XZ Utils。
    • -z,–gzip,–gunzip,–ungzip 调用gzip执行压缩或解压缩
    • -Z,–compress,–uncompress 调用compress执行压缩或解压缩

4 使用tar代替cp进行拷贝

一般来说我们都是使用cp进行拷贝的,然而使用cp拷贝时会修改被拷贝文件的创建日期,修改日期以及所有权.

另外,如果一个文件是另一个文件的硬链接的话,这个文件在拷贝时也会被复制成一个完全独立的新文件.

  • 为了解决这些问题,可以使用tar来代替cp进行拷贝. 像这样:

    tar cvf - * | (cd /dest/dir && tar xvfp -)
    

    这里第一个tar将文件打包后写入标准输出,然后通过管道传递给第二个tar,由第二个tar进行解压. 注意到第二个tar里面使用了 -p, 以保证文件权限不会被更改.

    使用这种方式的好处除了可以保持文件的硬连接,创建时间,修改时间以及所有权以外

  • 还可以做到 通过ssh复制到远程服务器上!

    tar -cvf - * | ssh remote_host 'cd /dest;tar xvfp -'
    

    这在没有rsync或scp时非常好用(不过这种情况应该很少见吧^_^).

  • 也可以与find命令相结合

    find . -depth |xargs tar cvf - | (cd ../tar_cp/ && tar xvfp -)