鸟哥Linux私房菜学习笔记——文件的压缩,打包与备份

1 文件的压缩

1.1 Linux文件系统常见的压缩指令

在 Linux 的环境中,压缩文件案的扩展名大多是:『 *.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2, *.xz』。

*.Z 		compress 程序压缩的文件;
*.zip 		zip 程序压缩的文件;
*.gz 		gzip 程序压缩的文件;
*.bz2 		bzip2 程序压缩的文件;
*.xz 		xz 程序压缩的文件;
*.tar 		tar 程序打包的数据,并没有压缩过;
*.tar.gz 	tar 程序打包的文件,其中并且经过 gzip 的压缩
*.tar.bz2 	tar 程序打包的文件,其中并且经过 bzip2 的压缩
*.tar.xz 	tar 程序打包的文件,其中并且经过 xz 的压缩

Linux 上常见的压缩指令就是 gzip, bzip2 以及最新的 xz ,至于compress 已经退流行了。为了支持windows 常见的 zip,其实 Linux 也早就有 zip 指令了! gzip 是由 GNU 计划所开发出来的压缩指令,该指令已经取代了 compress 。 后来 GNU 又开发出 bzip2 及 xz 这几个压缩比更好的压缩指令。不过,这些指令通常仅能针对一个文件来压缩与解压缩。tar 可以将很多文件『打包』成为一个文件!甚至是目录也可以这么玩。不过,单纯的 tar 功能仅是『打包』而已,亦即是将很多文件集结成为一个文件, 事实上,他并没有提供压缩的功能,后来,GNU 计划中,将整个 tar 与压缩的功能结合在一起,如此一来提供使用者更方便并且更强大的压缩与打包功能!

1.1.1 gzip, zcat/zmore/zless/zgrep

gzip 可以说是应用度最广的压缩指令了!目前 gzip 可以解开compress, zip 与 gzip 等软件所压缩的文件。 gzip 所建立的压缩文件为 *.gz 的文件名。

gzip [-cdtv#] 文件名
zcat 檔名.gz
选项与参数:
-c :将压缩的数据输出到屏幕上,可透过数据流重导向来处理;
-d :解压缩的参数;
-t :可以用来检验一个压缩文件的一致性~看看文件有无错误;
-v :可以显示出原文件/压缩文件案的压缩比等信息;
-# :# 为数字的意思,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!预设是 -6

当你使用 gzip 进行压缩时,在预设的状态下原本的文件会被压缩成为 .gz 的档名,源文件就不再存在了。这点与一般习惯使用 windows 做压缩的朋友所熟悉的情况不同!此外,使用 gzip 压缩的文件在 Windows 系统中,也可以被 WinRAR/7zip 这个软件解压缩。
若是文本文件,可以尝试使用 zcat/zmore/zless 去读取,此时屏幕上会显示解压缩之后的源文件内容。
gzip -d 会将原本的 .gz 删除,回复到原本的文件。

gzip -9 -c services > services.gz

上述命令,将services 用最佳的压缩比压缩,并保留原本的文件。
-c 可以将原本要转成压缩文件的资料内容,将它变成文字类型从屏幕输出, 然后我们可以透过大于(>) 这个符号,将原本应该由屏幕输出的数据,转成输出到文件而不是屏幕,所以就能够建立出压缩挡了。
另外,如果你还想要从文字压缩文件当中找数据的话,可以透过 egrep 来搜寻关键词喔!而不需要将压缩文件解开才以 grep 进行! 这对查询备份中的文本文件数据相当有用!
如果你还有备份数据使用的是 compress 建置出来的 .Z 文件,那也无须担心,使用 znew 可以将该文件转成 gzip 的格式。

1.1.2 bzip2, zcat/bzmore/bzless/bzgrep

若说 gzip 是为了取代 compress 并提供更好的压缩比而成立的,那么 bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的,bzip2 的用法几乎与 gzip 相同。

bzip2 [-cdkzv#] 文件名
bzcat 文件名.bz2
选项与参数:
-c :将压缩的过程产生的数据输出到屏幕上!
-d :解压缩的参数
-k :保留源文件,而不会删除原始的文件喔!
-z :压缩的参数 (默认值,可以不加)
-v :可以显示出原文件/压缩文件案的压缩比等信息;
-# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!

1.1.3 xz, xzcat/xzmore/xzless/xzgrep

虽然 bzip2 已经具有很棒的压缩比,不过显然某些自由软件开发者还不满足,因此后来还推出了 xz这个压缩比更高的软件!这个软件的用法也跟 gzip/bzip2 几乎一模一样!用法也跟 gzip/bzip2 几乎一模一样!

xz [-dtlkc#] 文件名
xcat 文件名.xz
选项与参数:
-d :就是解压缩啊!
-t :测试压缩文件的完整性,看有没有错误-l :列出压缩文件的相关信息
-k :保留原本的文件不删除~
-c :同样的,就是将数据由屏幕上输出的意思!
-# :同样的,也有较佳的压缩比的意思!

xz可以将 gzip 压缩比 (压缩后/压缩前) 的 21% 更进一步优化到 15%,不过, xz 最大的问题是时间花太久了!

1.2 打包指令: tar

tar 的选项与参数非常的多!这里只讲几个常用的选项。

1 tar [-z|-j|-J] [cv] [-f 待建立的新文件名] filename... <==打包与压缩
2 tar [-z|-j|-J] [tv] [-f 既有的 tar 文件名] <==查看文件名
3 tar [-z|-j|-J] [xv] [-f 既有的 tar 文件名] [-C 目录] <==解压缩
选项与参数:
-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 -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
  • 查 询:tar -jtv -f filename.tar.bz2
  • 解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
实例:

1.使用 tar 加入 -z, -j 或 -J 的参数备份 /etc/ 目录

time tar -zpcv -f /root/etc.tar.gz /etc
time tar -jpcv -f /root/etc.tar.bz2 /etc
time tar -Jpcv -f /root/etc.tar.xz /etc

time指令会列出压缩使用的时间。
2.查阅 tar 文件的数据内容 (可察看檔名),与备份文件名有否根目录的意义

tar -jtv -f /root/etc.tar.bz2

3.将备份的数据解压缩,并考虑特定目录的解压缩动作 (-C 选项的应用)

tar -jxv -f /root/etc.tar.bz2

此时该打包文件会在『本目录下进行解压缩』的动作。若想解压缩到指定目录,可以使用 -C 这个选项。

tar -jxv -f /root/etc.tar.bz2 -C /tmp

4.仅解开单一文件的方法

# 1. 先找到我们要的档名,假设解开 shadow 文件
tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
# 2. 将该文件解开!语法与实际作法如下:
tar -jxv -f 打包檔.tar.bz2 待解开档名
tar -jxv -f /root/etc.tar.bz2 etc/shadow

5.打包某目录,但不含该目录下的某些文件之作法

tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* \
> --exclude=/root/system.tar.bz2 /etc /root

上面的指令是一整列的~其实你可以打成:『tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root』,如果想要两行输入时,最后面加上反斜杠\并立刻按下[enter] , 就能够到第二行继续输入了。
6.仅备份比某个时刻还要新的文件

# 1. 先由 find 找出比 /etc/passwd 还要新的文件
find /etc -newer /etc/passwd
# 此时会显示出比 /etc/passwd 这个文件的 mtime 还要新的档名,

# 2. 好了,那么使用 tar 来进行打包吧!日期为上面看到的 2015/06/17
tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 > --newer-mtime="2015/06/17" /etc/*

# 3. 显示出文件即可
tar -jtv -f /root/etc.newer.then.passwd.tar.bz2 | grep -v '/$'

7.基本名称: tarfile, tarball ?
如果仅是打包而已,就是『 tar -cv -f file.tar 』而已,这个文件我们称呼为 tarfile 。如果还有进行压缩的支持,例如『 tar -jcv -f file.tar.bz2 』时,我们就称呼为 tarball (tar 球?)!
8.特殊应用:利用管线命令与数据流
在 tar 的使用中,有一种方式最特殊,那就是透过标准输入输出的数据流重导向(standard input/standard output), 以及管线命令 (pipe) 的方式,将待处理的文件一边打包一边解压缩到目标目录去。

# 1. 将 /etc 整个目录一边打包一边在 /tmp 解开
cd /tmp
tar -cvf - /etc | tar -xvf -
# 要注意的地方在于输出档变成 - 而输入档也变成 - ,又有一个 | 存在
# 这分别代表 standard output, standard input 与管线命令
# 简单的想法中,你可以将 - 想成是在内存中的一个装置(缓冲区)

你可能感兴趣的:(Linux笔记,linux)