linux中tar命令的用法

1.命令格式:

tar[必要参数][选择参数][文件]

2.命令功能:

用来压缩和解压文件。tar本身不具有压缩功能。他是调用压缩功能实现的

3.命令参数:

必要参数有如下:

-A 新增压缩文件到已存在的压缩

-B 设置区块大小

-c 建立新的压缩文件

-d 记录文件的差别

-r 添加文件到已经压缩的文件

-u 添加改变了和现有的文件到已经存在的压缩文件

-x 从压缩的文件中提取文件

-t 显示压缩文件的内容

-z 支持gzip解压文件

-j 支持bzip2解压文件

-Z 支持compress解压文件

-v 显示操作过程

-l 文件系统边界设置

-k 保留原有文件不覆盖

-m 保留文件不被覆盖

-W 确认压缩文件的正确性

可选参数如下:

-b 设置区块数目

-C 切换到指定目录

-f 指定压缩文件

–help 显示帮助信息

–version 显示版本信息

4.常见解压/压缩命令

tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName

(注:tar是打包,不是压缩!)

.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName

.tar.gz 和 .tgz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName

tar -czf myfile.tar.gz /etc/dir1 /var/www/html /home/somedir

第二个示例(请注意-czf参数中的z)将使用g(z)ip压缩tar文件。

.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName

.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
.bz
解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知

.tar.bz
解压:tar jxvf FileName.tar.bz
压缩:未知
.Z
解压:uncompress FileName.Z
压缩:compress FileName

.tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName

.zip
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
.rar
解压:rar x FileName.rar
压缩:rar a FileName.rar DirName

 

5.使用实例

实例1:将文件全部打包成tar包

命令:

输出:

说明:

tar -cvf log.tar log2012.log    仅打包,不压缩!

tar -zcvf log.tar.gz log2012.log   打包后,以 gzip 压缩
tar -zcvf log.tar.bz2 log2012.log  打包后,以 bzip2 压缩

在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。 如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar包; 如果加 j 参数,则以 .tar.bz2 来作为tar包名。

实例2:查阅上述 tar包内有哪些文件

命令:

tar -ztvf log.tar.gz

输出:

说明:

由于我们使用 gzip 压缩的log.tar.gz,所以要查阅log.tar.gz包内的文件时,就得要加上 z 这个参数了。

实例3:将tar 包解压缩

命令:

tar -zxvf /opt/soft/test/log.tar.gz

输出:


说明:

在预设的情况下,我们可以将压缩档在任何地方解开的

实例4:只将 /tar 内的 部分文件解压出来

命令:


输出:

说明:

我可以透过 tar -ztvf 来查阅 tar 包内的文件名称,如果单只要一个文件,就可以透过这个方式来解压部分文件!

实例5:文件备份下来,并且保存其权限

命令:

复制代码

代码如下:

tar -zcvpf log31.tar.gz log2014.log log2015.log log2016.log

输出:

复制代码

代码如下:

[root@localhost test]# ll
总计 0
-rw-r–r– 1 root root 0 11-13 06:03 log2014.log
-rw-r–r– 1 root root 0 11-13 06:06 log2015.log
-rw-r–r– 1 root root 0 11-16 14:41 log2016.log
[root@localhost test]# tar -zcvpf log31.tar.gz log2014.log log2015.log log2016.log
log2014.log
log2015.log
log2016.log
[root@localhost test]# cd test6
[root@localhost test6]# ll
[root@localhost test6]# tar -zxvpf /opt/soft/test/log31.tar.gz
log2014.log
log2015.log
log2016.log
[root@localhost test6]# ll
总计 0
-rw-r–r– 1 root root 0 11-13 06:03 log2014.log
-rw-r–r– 1 root root 0 11-13 06:06 log2015.log
-rw-r–r– 1 root root 0 11-16 14:41 log2016.log
[root@localhost test6]#

说明:

这个 -p 的属性是很重要的,尤其是当您要保留原本文件的属性时

实例6:在 文件夹当中,比某个日期新的文件才备份

命令:

复制代码

代码如下:

tar -N “2012/11/13” -zcvf log17.tar.gz test

输出:

复制代码

代码如下:

[root@localhost soft]# tar -N “2012/11/13” -zcvf log17.tar.gz test
tar: Treating date `2012/11/13′ as 2012-11-13 00:00:00 + 0 nanoseconds
test/test/log31.tar.gz
test/log2014.log
test/linklog.log
test/log2015.log
test/log2013.log
test/log2012.log
test/log2017.log
test/log2016.log
test/log30.tar.gz
test/log.tar
test/log.tar.bz2
test/log.tar.gz

说明:

实例7:备份文件夹内容是排除部分文件

命令:

复制代码

代码如下:

tar –exclude scf/service -zcvf scf.tar.gz scf/*

输出:

复制代码

代码如下:

[root@localhost test]# tree scf
scf
|– bin
|– doc
|– lib
`– service
`– deploy
|– info
`– product
7 directories, 0 files
[root@localhost test]# tar –exclude scf/service -zcvf scf.tar.gz scf/*
scf/bin/
scf/doc/
scf/lib/
[root@localhost test]#</p> <p>

【实例】

1.将文件解压到指定目录下

命令:tar zxvf test.tgz -C 指定目录

如:tar zxvf /usr/local/jdk-8u161-linux-x64.tar.gz -C /usr/local/jdk1.8

将压缩文件jdk-8u161-linux-x64.tar.gz解压到/usr/local/jdk1.8目录下

tar -cvf test.tar.gz test #查看test.tar.gz包中内容;
tar -rf test.tar.gz test.txt #将test.txt文件追加到test.tar.gz 中
tar -xvf test.tar.gz #解压test.tar.gz程序包;
tar -czvf test.tar.gz test #使用gzip 格 式打 包并 压 缩test目录;
tar -cjvf test.tar.bz2 test #使用bzip2格式打包并压缩test目录;
tar -czf test.tar.gz * -X list.txt #使用 gzip 格式打包并压当前目录所有文件,排除list.txt 中记录的文件;
tar -czf test.tar.gz * –exclude=zabbix-3.2.4.tar.gz –exclude=nginx-1.12.0.tar.gz #使用gzip格式打包并压当前目录所有文件及目录,排除 zabbix-3.2.4.tar.gz 和 nginx-1.12.0.tar.gz 软件包。

tar命令高级用法——备份数据

seanlook
Linux上有功能强大的tar命令,tar最初是为了制作磁带备份(tape archive)而设计的,它的作用是把文件和目录备份到磁带中,然后从磁带中提取或恢复文件。现在我们可以使用tar来备份数据到任何存储介质上。它是文件级备份,不必考虑底层文件系统类别,并且支持增量备份。

部分常用选项

  • -z, –gzip:使用gzip工具(解)压缩,后缀一般为.gz
  • -c, –create:tar打包,后缀一般为.tar
  • -f, –file=:后面立刻接打包或压缩后得到的文件名
  • -x, –extract:解包命令,与-c对应
  • -p:保留备份数据的原本权限和属性
  • -g:后接增量备份的快照文件
  • -C:指定解压缩的目录
  • –exclude:排除不打包的目录或文件,支持正则匹配

其他

  • -X, –exclude-from:在一个文件中列出要排除的目录或文件(在--exclude=较多时使用)
  • -t, –list:列出备份档案中的文件列表,不与-c-x同时出现
  • -j, –bzip2:使用bzip2工具(解)压缩,后缀一般为.bz2
  • -P:保留绝对路径,解压时同样会自动解压到绝对路径下
  • -v:(解)压缩过程显示文件处理过程,常用但不建议对大型文件使用

增量备份(网站)数据

许多系统(应用或网站)每天都有静态文件产生,对于一些比较重要的静态文件如果有进行定期备份的需求,就可以通过tar打包压缩备份到指定的地方,特别是对一些总文件比较大比较多的情况,还可以利用-g选项来做增量备份。

备份的目录最好使用相对路径,也就是进入到需要备份的根目录下

具体示例方法如下。

备份当前目录下的所有文件
# tar -g /tmp/snapshot_data.snap -zcpf /tmp/data01.tar.gz .

在需要恢复的目录下解压恢复
# tar -zxpf /tmp/data01.tar.gz -C .

-g选项可以理解备份时给目录文件做一个快照,记录权限和属性等信息,第一次备份时/tmp/snapshot_data.snap不存在,会新建一个并做完全备份。当目录下的文件有修改后,再次执行第一条备份命令(记得修改后面的档案文件名),会自动根据-g指定的快照文件,增量备份修改过的文件,包括权限和属性,没有动过的文件不会重复备份。

另外需要注意上面的恢复,是“保留恢复”,即存在相同文件名的文件会被覆盖,而原目录下已存在(但备份档案里没有)的,会依然保留。所以如果你想完全恢复到与备份文件一模一样,需要清空原目录。如果有增量备份档案,则还需要使用同样的方式分别解压这些档案,而且要注意顺序。

下面演示一个比较综合的例子,要求:

  • 备份/tmp/data目录,但cache目录以及临时文件排除在外
  • 由于目录比较大(>4G),所以全备时分割备份的档案(如每个备份档案文件最大1G)
  • 保留所有文件的权限和属性,如用户组和读写权限
# cd /tmp/data

做一次完全备份
# rm -f /tmp/snapshot_data.snap
# tar -g /tmp/snapshot_data.snap -zcpf - --exclude=./cache ./ | split -b 1024M - /tmp/bak_data$(date -I).tar.gz_
分割后文件名后会依次加上aa,ab,ac,...,上面最终的备份归档会保存成
bak_data2014-12-07.tar.gz_aa
bak_data2014-12-07.tar.gz_ab
bak_data2014-12-07.tar.gz_ac
...

增量备份
可以是与完全备份一模一样的命令,但需要注意的是假如你一天备份多次,可能导致档案文件名重复,那么就会导致
备份实现,因为split依然会从aa,ab开始命名,如果一天的文件产生(修改)量不是特别大,那么建议增量部分不
分割处理了:( 一定要分割的话,文件名加入更细致的时间如$(date +%Y-%m-%d_%H) )
# tar -g /tmp/snapshot_data.snap -zcpf /tmp/bak_data2014-12-07.tar.gz --exclude=./cache ./

第二天增备
# tar -g /tmp/snapshot_data.snap -zcpf /tmp/bak_data2014-12-08.tar.gz --exclude=./cache ./

恢复过程

恢复完全备份的档案文件
可以选择是否先清空/tmp/data/目录
# cat /tmp/bak_data2014-12-07.tar.gz_* | tar -zxpf - -C /tmp/data/

恢复增量备份的档案文件
$ tar –zxpf /tmp/bak_data2014-12-07.tar.gz -C /tmp/data/
$ tar –zxpf /tmp/bak_data2014-12-08.tar.gz -C /tmp/data/
...
一定要保证是按时间顺序恢复的,像下面文件名规则也可以使用上面通配符的形式

如果需要定期备份,如每周一次全备,每天一次增量备份,则可以结合crontab实现。

备份文件系统

备份文件系统方法有很多,例如cpio, rsync, dump, tar,这里演示一个通过tar备份整个Linux系统的例子,整个备份与恢复过程与上面类似。
首先Linux(这里是CentOS)有一部分目录是没必要备份的,如/proc/lost+found/sys/mnt/media/dev/proc/tmp,如果是备份到磁带/dev/st0则不必关心那么多,因为我这里是备份到本地/backup目录,所以也需要排除,还有其它一些NFS或者网络存储挂载的目录。

创建排除列表文件
# vi /backup/backup_tar_exclude.list
/backup
/proc
/lost+found
/sys
/mnt
/media
/dev
/tmp

$ tar -zcpf /backup/backup_full.tar.gz -g /backup/tar_snapshot.snap --exclude-from=/backup/tar_exclude.list /

注意

使用tar无论是备份数据还是文件系统,需要考虑是在原系统上恢复还是另一个新的系统上恢复。

  • tar备份极度依赖于文件的atime属性,
  • 文件所属用户是根据用户ID来确定的,异机恢复需要考虑相同用户拥有相同USERID
  • 备份和恢复的过程尽量不要运行其他进程,可能会导致数据不一致
  • 软硬连接文件可以正常恢复

参考


原文链接地址:http://seanlook.com/2014/12/08/tar_backup_filesystem/