gzip, bzip2, xz 也能够针对目录来进行压缩,不过它们都是对目录下的文件逐个压缩的。而tar指令则可以将这些文件先打包成一个大文件,然后再进行压缩操作。
仅用tar命令打包不压缩的文件,称为tarfile,既打包又压缩的文件,如file.tar.gz则成为tarball。
tar指令的选项非常多,一般只是用几个常用的,基本语法如下:
1 | tar [-z|-j|-J] [cv] [-f 待建立的文件名] filename... <==打包与压缩 |
一般来说,tar命令只要记住下面这个范例就行了:
压 缩:tar -jcv -f filename.tar.bz2
要被压缩的文件或目录名称
查 询:tar -jtv -f filename.tar.bz2
解压缩:tar -jxv -f filename.tar.bz2 -C
欲解压缩的目录
filename.tar.bz2 是我们自己取的文件名,tar 并不会自动帮我们生成打包压缩后的文件名。文件命名最好符合规范。示例:
使用tar命令打包/etc/目录,然后使用-z
,-j
,-J
选项进行压缩,并观察结果与耗时
1 | root@ubuntu:/temp# time tar -zpcv -f etc.tar.gz /etc |
查阅 tar 文件的数据内容
1 | root@ubuntu:/temp# tar -ztv -f etc.tar.gz |
可发现,每个文件名都没了根目录。正如备份的时候出现的警告:tar: Removing leading `/‘ from member names那样。这种做法主要是为了防止解压缩的时候出现覆盖源文件的情况。
如果要保留文件的根目录/,则可以使用-P
(大写)选项。
指定目录解压缩
如果直接在当前目录下执行命令:tar -jxv -f /root/etc.tar.bz2
,则目录下会多出个etc的目录。如果要指定解压缩的目录,可以使用-C
选项。如将/temp/etc.tar.gz解压到/tmp目录下
1 | root@ubuntu:/temp# tar -zxv -f etc.tar.gz -C /tmp |
指定解压某个文件
除了一次性全部解压,我们还可以指定解压某个文件。比如我要解压etc.tar.gz下的etc/shadow,可以使用如下命令:
1 | root@ubuntu:/temp# tar -zxv -f etc.tar.gz etc/shadow |
打包某目录,但不含该目录下的某些文件
比如我想打包/etc目录,但是不想包含目录下的ppp和qqq文件:
1 | root@ubuntu:/temp# tar -zcv -f etc.tar.gz --exclude=/etc/ppp --exclude=/etc/qqq /etc |
或者:
1 | root@ubuntu:/temp# vi exclude-file |
里面输入
1 | /etc/ppp |
然后使用命令:
1 | root@ubuntu:/temp# tar -zcvf etc.tar.gz --exclude-from exclude-file /etc |
仅备份比某个时刻还要新的文件
比如,仅备份比/etc/passwd文件新的文件(mtime):
1 | root@ubuntu:/temp# ls -l /etc/passwd |
《鸟哥的Linux私房菜》读书笔记