tar
参考:鸟哥的 Linux 私房菜 -- Linux 的文件压缩与打包 (vbird.org)
参考:- 如何复制文件在 linux 比 cp 更快和安全 - ZYLK
参考:使用tar代替cp进行拷贝 - 暗无天日 (lujun9972.win)
tar参数
选项与参数:
-c :创建打包文件,可搭配 -v 来察看过程中被打包的文件名(filename)
-t :察看打包文件的内容含有哪些文件名,重点在察看“文件名”就是了;
-x :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开
特别留意的是, -c, -t, -x 不可同时出现在一串命令行中。
-z :通过 gzip 的支持进行压缩/解压缩:此时文件名最好为 *.tar.gz
-j :通过 bzip2 的支持进行压缩/解压缩:此时文件名最好为 *.tar.bz2
-J :通过 xz 的支持进行压缩/解压缩:此时文件名最好为 *.tar.xz
特别留意, -z, -j, -J 不可以同时出现在一串命令行中
-v :在压缩/解压缩的过程中,将正在处理的文件名显示出来!
-f filename:-f 后面要立刻接要被处理的文件名!建议 -f 单独写一个选项啰!(比较不会忘记)
-C 目录 :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。其他后续练习会使用到的选项介绍:
-p(小写) :保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件
-P(大写) :保留绝对路径,亦即允许备份数据中含有根目录存在之意;(不建议用)
--exclude=FILE:在压缩的过程中,不要将 FILE 打包!
tar基本命令
tar -zcvf xxx.tar.gz /xxx
解压xxx.tar.gz,会自动在当前目录创建一个xxx目录
tar zxvf xxx.tar.gz
tar替代cp
cp命令的缺点:
cp
命令会逐个读取文件,然后写入到新的位置,导致速度很慢;tar
命令会尽可能多地读取文件内容,然后才成批写入新的位置。- 某些文件类型(例如链接文件)和权限,和被拷贝文件的创建日期等,cp命令不能很好的支持复制,此时tar的“ -p ”这个选项的就可以保存原本文件的权限与属性!
至于cp命令为什么慢呢,可以看其他人的回答:
参考:鸟哥书中关于tar模拟cp命令的疑问 - SegmentFault 思否
接下来,让我们实操用tar代替cp。
创建两个目录
xx@ubuntu022:~/test$ mkdir fwork1 fwork2 fwork1/dir1
xx@ubuntu022:~/test$ tree .
├── fwork1
│ └── dir1
└── fwork2
将当前目录下的fwork1下的dir1 复制到fwork2下
(cd 备份资源原路径 ;sudo tar cvfp - 需要备份的文件目录或*(*代表资源路径下所有资源) ) | (cd 备份资源存储路径;sudo tar xvfp -)
例如
(cd /test/fwork1 ;sudo tar cvfp - dir1 ) | (cd /test/fwork2 ;sudo tar xvfp -)
通过标准输入输出的数据流重导向(standard input/standard output), 以及管线命令 (pipe) 的方式,将待处理的文件一边打包一边解压缩到目标目录去。也就是说第一个tar将文件打包后写入标准输出,然后通过管道传递给第二个tar,由第二个tar进行解压.
使用这种方式的好处除了可以保持文件的硬连接,创建时间,修改时间以及所有权
注意几点:
- 打包时指定的目录如果是dir1, 那么解压后的目录也是dir1,打包时如果打包命令是fwork1/dir1,那么解压后包也会保存fowrk1,因此我们不能直接使用tar zcvfp - ./fwork1/dir1,正确的做法是先切到要打包的资源的上级目录,然后打包,例如我想把dir1复制一份到fwork2,那么首先切换到fwork1目录
- 先切换到目录,在打包,两个命令之间应该用’;‘,而不应该用’&‘,用’&‘会提示无法找到目录
- tar命令后面的参数不需要带’-‘,如果加了就会报错
- tar命令后面的参数不需要加’z',加了也会报错
此时,我们就将dir1从fwork1复制到fwork2了
xx@ubuntu022:~/test$ tree
├── fwork1
│ └── dir1
└── fwork2
└── dir1
当然我们也可以把目录复制到远程
tar -cvf - ./dir1 | ssh remote_host 'cd /opt ; tar xvfp -'
这在没有rsync或scp时非常好用(不过这种情况应该很少见吧^_^).