tar命令可以为linux的文件和目录创建档案。利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。
首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件。
为什么要区分这两个概念呢?这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)。
语法
tar [-ABcdgGhiklmMoOpPrRsStuUvwWxzZ][-b <区块数目>][-C <目的目录>][-f <备份文件>][-F <Script文件>][-K <文件>][-L <媒体容量>][-N <日期时间>][-T <范本文件>][-V <卷册名称>][-X <范本文件>][-<设备编号><存储密度>][--after-date=<日期时间>][--atime-preserve][--backuup=<备份方式>][--checkpoint][--concatenate][--confirmation][--delete][--exclude=<范本样式>][--force-local][--group=<群组名称>][--help][--ignore-failed-read][--new-volume-script=<Script文件>][--newer-mtime][--no-recursion][--null][--numeric-owner][--owner=<用户名称>][--posix][--erve][--preserve-order][--preserve-permissions][--record-size=<区块数目>][--recursive-unlink][--remove-files][--rsh-command=<执行指令>][--same-owner][--suffix=<备份字尾字符串>][--totals][--use-compress-program=<执行指令>][--version][--volno-file=<编号文件>][文件或目录...]
参数 :
-A
或--catenate
:新增文件到已存在的备份文件。-b<区块数目>
或--blocking-factor=<区块数目>
:设置每笔记录的区块数目,每个区块大小为12Bytes。-B
或--read-full-records
:读取数据时重设区块大小。-c
或--create
:建立新的备份文件。-C<目的目录>
或--directory=<目的目录>
:切换到指定的目录。-d
或--diff
或--compare
:对比备份文件内和文件系统上的文件的差异。-f<备份文件>
或--file=<备份文件>
:指定备份文件。-F<Script文件>
或--info-script=<Script文件>
:每次更换磁带时,就执行指定的Script文件。-g
或--listed-incremental
:处理GNU格式的大量备份。-G
或--incremental
:处理旧的GNU格式的大量备份。-h
或--dereference
:不建立符号连接,直接复制该连接所指向的原始文件。-i
或--ignore-zeros
:忽略备份文件中的0 Byte区块,也就是EOF。-k
或--keep-old-files
:解开备份文件时,不覆盖已有的文件。-K<文件>
或--starting-file=<文件>
:从指定的文件开始还原。-l
或--one-file-system
:复制的文件或目录存放的文件系统,必须与tar指令执行时所处的文件系统相同,否则不予复制。-L<媒体容量>
或-tape-length=<媒体容量>
:设置存放每体的容量,单位以1024 Bytes计算。-m
或--modification-time
:还原文件时,不变更文件的更改时间。-M
或--multi-volume
:在建立,还原备份文件或列出其中的内容时,采用多卷册模式。-N<日期格式>
或--newer=<日期时间>
:只将较指定日期更新的文件保存到备份文件里。-o
或--old-archive
或--portability
:将资料写入备份文件时使用V7格式。-O
或--stdout
:把从备份文件里还原的文件输出到标准输出设备。-p
或--same-permissions
:用原来的文件权限还原文件。-P
或--absolute-names
:文件名使用绝对名称,不移除文件名称前的"/"号。-r
或--append
:新增文件到已存在的备份文件的结尾部分。-R
或--block-number
:列出每个信息在备份文件中的区块编号。-s
或--same-order
:还原文件的顺序和备份文件内的存放顺序相同。-S
或--sparse
:倘若一个文件内含大量的连续0字节,则将此文件存成稀疏文件。-t
或--list
:列出备份文件的内容。-T<范本文件>
或--files-from=<范本文件>
:指定范本文件,其内含有一个或多个范本样式,让tar解开或建立符合设置条件的文件。-u
或--update
:仅置换较备份文件内的文件更新的文件。-U
或--unlink-first
:解开压缩文件还原文件之前,先解除文件的连接。-v
或--verbose
:显示指令执行过程。-V<卷册名称>
或--label=<卷册名称>
:建立使用指定的卷册名称的备份文件。-w
或--interactive
:遭遇问题时先询问用户。-W
或--verify
:写入备份文件后,确认文件正确无误。-x
或--extract
或--get
:从备份文件中还原文件。-X<范本文件>
或--exclude-from=<范本文件>
:指定范本文件,其内含有一个或多个范本样式,让ar排除符合设置条件的文件。-z
或--gzip
或--ungzip
:通过gzip指令处理备份文件。-Z
或--compress
或--uncompress
:通过compress指令处理备份文件。-<设备编号><存储密度>
:设置备份用的外围设备编号及存放数据的密度。--after-date=<日期时间>
:此参数的效果和指定-N
参数相同。--atime-preserve
:不变更文件的存取时间。--backup=<备份方式>
或--backup
移除文件前先进行备份。--checkpoint
:读取备份文件时列出目录名称。--concatenate
:此参数的效果和指定-A
参数相同。--confirmation
:此参数的效果和指定-w
参数相同。--delete
:从备份文件中删除指定的文件。--exclude=<范本样式>
:排除符合范本样式的文件。--group=<群组名称>
:把加入设备文件中的文件的所属群组设成指定的群组。--help
:在线帮助。--ignore-failed-read
:忽略数据读取错误,不中断程序的执行。--new-volume-script=<Script文件>
此参数的效果和指定-F
参数相同。--newer-mtime
:只保存更改过的文件。--no-recursion
:不做递归处理,也就是指定目录下的所有文件及子目录不予处理。--null
:从null设备读取文件名称。--numeric-owner
:以用户识别码及群组识别码取代用户名称和群组名称。--owner=<用户名称>
:把加入备份文件中的文件的拥有者设成指定的用户。--posix
:将数据写入备份文件时使用POSIX格式。--preserve
:此参数的效果和指定-ps
参数相同。--preserve-order
:此参数的效果和指定-A
参数相同。--preserve-permissions
:此参数的效果和指定-p
参数相同。--record-size=<区块数目>
:此参数的效果和指定-b
参数相同。--recursive-unlink
:解开压缩文件还原目录之前,先解除整个目录下所有文件的连接。--remove-files
:文件加入备份文件后,就将其删除。--rsh-command=<执行指令>
:设置要在远端主机上执行的指令,以取代rsh指令。--same-owner
:尝试以相同的文件拥有者还原文件。--suffix=<备份字尾字符串>
:移除文件前先行备份。--totals
:备份文件建立后,列出文件大小。--use-compress-program=<执行指令>
:通过指定的指令处理备份文件。--version
:显示版本信息。--volno-file=<编号文件>
:使用指定文件内的编号取代预设的卷册编号。
实例
- 压缩文件(非打包)
# touch a.c # tar -czvf test.tar.gz a.c //压缩 a.c文件为test.tar.gz a.c
- 列出压缩文件内容
# tar -tzvf test.tar.gz - rw-r--r-- root/root 0 2010-05-24 16:51:59 a.c
- 解压文件
# tar -xzvf test.tar.gz a.c
实例
z
:有gzip属性的j
:有bz2属性的Z
:有compress属性的v
:显示所有过程O
:将文件解开到标准输出
tar -cf archive.tar foo bar # 从文件 foo 和 bar 创建归档文件 archive.tar。
tar -tvf archive.tar # 详细列举归档文件 archive.tar 中的所有文件。
tar -xf archive.tar # 展开归档文件 archive.tar 中的所有文件。
- 下面的参数
-f
是必须的 -f
: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。tar -cf all.tar *.jpg # 这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。 tar -rf all.tar *.gif # 这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。 tar -uf all.tar logo.gif # 这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。 tar -tf all.tar # 这条命令是列出all.tar包中所有文件,-t是列出文件的意思 tar -cfv archive.tar foo bar # 从文件foo和bar创建archive.tar。 tar -tvf archive.tar # 详细列出archive.tar中的所有文件。 tar -xf archive.tar # 从archive.tar提取所有文件。
zip格式
- 压缩:
zip -r [目标文件名] .zip [原文件/目录名]
- 解压:
unzip [原文件名].zip
- 注:-r参数代表递归
tar 格式(该格式仅仅打包,不压缩)
- 打包:
tar -cvf [目标文件名] .tar [原文件名/目录名]
- 解包:
tar -xvf [原文件名].tar
- 注:c参数代表create(创建),x参数代表extract(解包),v参数代表verbose(详细信息),f参数代表filename(文件名),所以f后必须接文件名。
tar.gz格式
- 方式一:利用前面已经打包好的tar 文件,直接用压缩命令。
- 压缩:
gzip [原文件名].tar
- 解压:
gunzip [原文件名].tar .gz
- 压缩:
- 方式二:一次性打包并压缩、解压并解包
- 打包并压缩:
tar -zcvf [目标文件名] .tar .gz [原文件名/目录名]
- 解压并解包:
tar -zxvf [原文件名] .tar .gz
- 打包并压缩:
- 注:z代表用gzip算法来压缩/解压。
tar .bz2格式
- 方式一:利用已经打包好的tar 文件,直接执行压缩命令:
- 压缩:
bzip2 [原文件名].tar
- 解压:
bunzip2 [原文件名].tar .bz2
- 压缩:
- 方式二:一次性打包并压缩、解压并解包
- 打包并压缩:
tar -jcvf [目标文件名].tar .bz2 [原文件名/目录名]
- 解压并解包:
tar -jxvf [原文件名].tar .bz2
- 打包并压缩:
- 注:小写j代表用bzip2算法来压缩/解压。
tar .xz格式
- 方式一:利用已经打包好的tar 文件,直接用压缩命令:
- 压缩:
xz [原文件名].tar
- 解压:
unxz [原文件名].tar .xz
- 压缩:
- 方式二:一次性打包并压缩、解压并解包
- 打包并压缩:
tar -Jcvf [目标文件名].tar .xz [原文件名/目录名]
- 解压并解包:
tar -Jxvf [原文件名].tar .xz
- 打包并压缩:
- 注:大写J代表用xz算法来压缩/解压。
tar .Z格式(已过时)
- 方式一:利用已经打包好的tar 文件,直接用压缩命令:
- 压缩:
compress [原文件名].tar
- 解压:
uncompress [原文件名].tar .Z
- 压缩:
- 方式二:一次性打包并压缩、解压并解包
- 打包并压缩:
tar -Zcvf [目标文件名].tar .Z [原文件名/目录名]
- 解压并解包:
tar -Zxvf [原文件名].tar .Z
- 打包并压缩:
- 注:大写Z代表用ncompress算法来压缩/解压。另,ncompress是早期Unix系统的压缩格式,但由于ncompress的压缩率太低,现已过时。
jar格式
- 压缩:
jar -cvf [目标文件名].jar [原文件名/目录名]
- 解压:
jar -xvf [原文件名].jar
- 注:如果是打包的是Java类库,并且该类库中存在主类,那么需要写一个META-INF/MANIFEST.MF配置文件,内容如下:
Manifest-Version: 1.0 Created-By: 1.6.0_27 (Sun Microsystems Inc.) Main-class: the_name_of_the_main_class_should_be_put_here
- 然后用如下命令打包:
jar -cvfm [目标文件名].jar META-INF/MANIFEST.MF [原文件名/目录名]
- 这样以后就能用“Java -jar [文件名].jar”命令直接运行主类中的public static void main方法了。
7z格式
- 压缩:
7z a [目标文件名].7z [原文件名/目录名]
- 解压:
7z x [原文件名].7z
- 注:这个7z解压命令支持rar格式,即:
7z x [原文件名].rar
其它例子
- 将文件全部打包成tar 包 :
tar -cvf log.tar log2012.log 仅打包,不压缩! tar -zcvf log.tar.gz log2012.log 打包后,以 gzip 压缩 tar -jcvf log.tar.bz2 log2012.log 打包后,以 bzip2 压缩
- 在选项
f
之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。 如果加z
选项,则以.tar .gz或.tgz来代表gzip压缩过的tar 包;如果加j
选项,则以.tar .bz2来作为tar 包名。
- 在选项
- 解压目录
- 去掉第一层目录结构,要出除第二层,–strip-components 2
tar -xvf portal-web-v2.0.0.tar --strip-components 1 -C 指定目录
- 去掉第一层目录结构,要出除第二层,–strip-components 2
- 查阅上述tar 包内有哪些文件 :
tar -ztvf log.tar.gz
- 由于我们使用 gzip 压缩的log.tar .gz,所以要查阅log.tar .gz包内的文件时,就得要加上
z
这个选项了。
- 由于我们使用 gzip 压缩的log.tar .gz,所以要查阅log.tar .gz包内的文件时,就得要加上
- 将tar 包解压缩 :
tar -zxvf /opt/soft/test/log.tar.gz
- 在预设的情况下,我们可以将压缩档在任何地方解开的
- 只将tar 内的部分文件解压出来 :
tar -zxvf /opt/soft/test/log30.tar.gz log2013.log
- 我可以透过
tar -ztvf
来查阅 tar 包内的文件名称,如果单只要一个文件,就可以透过这个方式来解压部分文件!
- 我可以透过
- 文件备份下来,并且保存其权限 :
tar -zcvpf log31.tar.gz log2014.log log2015.log log2016.log
- 这个
-p
的属性是很重要的,尤其是当您要保留原本文件的属性时。 - 在文件夹当中,比某个日期新的文件才备份 :
tar -N "2012/11/13" -zcvf log17.tar.gz test
- 备份文件夹内容是排除部分文件:
tar --exclude scf/service -zcvf scf.tar.gz scf/*
- 打包文件之后删除源文件:
tar -cvf test.tar test --remove-files
- 其实最简单的使用 tar 就只要记忆底下的方式即可:
压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称 查 询:tar -jtv -f filename.tar.bz2 解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
下一节:unarj命令用来解压缩由arj命令创建的压缩包。