tar命令
语法概述
虽然,gzip,bzip2,xz
能够针对目录进行压缩,但其对目录压缩指的是”将目录内的所有文件 分别 进行压缩“。而非类似WINRAR这类软件,可以将很多文件打包成一个文件的样式。
tar
不仅可以打包,还可以通过gzip/bzip2/xz
打包的同时执行压缩。
打包并压缩
1 | tar [-z | -j | -J] [cv] [-f tar文件名] 待打包对象 ===>tar -zcv -f xxx.tar.gz sourcename |
主要选项:(c,t,x三个选项不可同时出现在一条指令中,只需要记住c,t,x三个选项即可)
-c
:建立打包文件,可搭配-v查看过程中被打包的文件名称-t
:tar包中包含哪些文件-x
:解包或解压缩,可以打包-C在特定目录中解包或解压缩
压缩选项
-z
:通过gzip压缩和解压缩,其文件名最好指定为*.tar.gz
-j
:通过bzip2压缩和解压缩,其文件名最好指定为*.tar.bz2
-J
:通过xz压缩和解压缩,其文件名最好指定为*.tar.xz
其他选项
-v
:在压缩/解压缩过程中显示详细信息-f filename
:-f选项后面需要立即跟上将要生成的打包压缩后的文件名称,建议-f选项单独写出来,不要跟上面的选项写在一起-C
目录:用于解压缩时,在特定目录中解压缩-p,--preserve-permissions
:保留备份数据的原本权限和属性,常用于备份-P
:保留绝对完整路径,即允许备份数据中含有根目录--xattrs
:保留高级权限信息,例如ACL和SELinux上下问--exclude=filename
:在压缩过程中,不要将filename
打包
tar注意事项
1.使用tar打包时,生成的打包文件的文件名如果与目标路径下的文件名冲突,tar会覆盖目标文件而且不会警告
2.在使用绝对路径打包时,将默认从文件名中删除该路径前面的/符号。
tarfile和tarball
需要指出的是,tar
打包出来的文件,根据有没有进行压缩,其所产生的文件的称呼不同。
如果是tar-cv -f name.tar
打包,则称为tarfile
如果还进行了压缩,则称为tarball
查看归档
1 | # 查看归档文件中的信息 |
打包
打包当前目录下的文件,不包含目录
1 | # 首先需要cd到目标目录,然后执行 |
打包指定的绝对路径
情况如下:
1 | [oracle@localhost ~]$ pwd |
tar命令会默认使用相对路径,如果使用绝对路径且不加相应参数时,就会出现此error。
其实也很简单,在tar命令的参数中加入-P
参数即可。但是我们需要注意-P
参数的位置,要将其放在-z和-f之间。即:
1 | tar -czvpP -f autoinstall_19c_on_ol8.7.tar.gz /vagrant |
备份/etc/目录(-p保留原始权限和属性信息)
1 | time tar -zcvp -f /root/etc.tar.gz /etc |
打包指定目录,但排除特定文件
1 | # 打包/root/目录,但排除特定文件 |
时间选项
仅备份比某个时刻还要新的文件
此时,--newer-mtime
选项就需要用到了,其实是有两个选项,一个是--newer
,另一个是--newer-mtime
。
当使用--newer
时,表示后续的日期包含【mtime
和ctime
】,而--newer-mtime
则仅是mtime
而已
1 | tar -zcv -f /root/newer.tar.gz --new-mtime="2020/06/03" /etc/* |
解包
解压到指定目录
1 | tar -zxv -f etc.tar.gz -C /tmp/test |
仅解压单一文件
1 | #在tar包中搜索 |
一次性解压多个tar.gz
1 | $ for files in ./*.tar.gz; do tar -zxvf $files -C /tmp/; done |
不包含父目录
1 | [root@88a920042b2f httpd-2.4.54]# tar -ztvf apr-1.7.0.tar.gz |
不包含原目录
解压时不包含原目录:--strip-components 1
解压至下一级目录,若为2则解压至下下级目录
比如,log.tar.gz
中压缩了test
目录,常规解压时会自动创建test
目录
1 | tar -zxvf log.tar.gz --strip-components 1 -C /dir1 # 将直接在dir1下展开test目录中的内容 |
tar到磁带
磁带机由于是一次性读取/写入设备,因此不能够使用cp
指令来复制。
如果想要将/home
,/root
,/etc
备份到磁带机/dev/st0
,则:
1 | tar -cv -f /dev/st0 /home /root /etc |
打包和解压进度条
tar
配合pv
命令实现打包和解压进度条:
压缩文件时,在tar
和gzip
中间使用pv
,把待压缩的文件的大小传递给pv
: 测试有效
1 | tar -cf - a.csv | pv -s $(du -sb a.csv | awk '{print $1}') | gzip > a.tgz |
其中,横线表示把tar
的结果传送到标准输出,以作为gzip
的输入。
解压缩:
1 | pv question.tar.gz | tar -zxf - |
直接把文件传递给pv
,pv
把文件读取到stdout
,作为tar
的输入。
tar和管道
1 | tmp>tar -cvf - /etc | tar -xvf - |
上面的指令,有点类似cp -r /etc /tmp
,那么为何不直接使用cp -r /etc /tmp
呢?
自然是cp -r
有些麻烦,而且不想让中间文件存在,哈哈。
注意:输出文件变成了“-
”,输入文件也变成“-
”,这就代表打包生成的文件。
tar和selinux
通常大部分情况下,用不到使用tar
的备份直接恢复系统文件,但如果你这么做,需要特别留意selinux
的问题,尤其是系统文件,例如/etc
目录下的文件。
虽然可以通过tar
备份/etc/
,并且也可以将其在其他机器上恢复,但是恢复后是无法进入系统的,虽然单人维护模式看起来一切正常。大部分原因是因为/etc/shadow
文件的selinux
类型在还原时被更改了。
对于上面的问题,如何处理呢?有以下几种方式:
- 通过各种救援方式进入系统,然后修改
/etc/selinux/config
文件,将selinux
改为permissive
模式,重启。 - 在第一次恢复后,不要立即重启,先使用
restorecon -Rv /etc
自动修复一下SElinux
的类型即可 - 通过各种救援方式进入系统,创建
/.autorelabel
文件,重新启动后系统会自动修复selinux
的类型,并且会自动再次重启,之后恢复正常。