您在 Linux 中最有可能使用的三个存档工具是 GNU tar、GNU cpio 和 rpm(Red Hat Packet Manager)。"Tar" 是 't'ape 'ar'chiver(磁带存档程序)的缩写;它最初用于进行磁带备份。Cpio 得名于 "copy input and output"(拷贝输入和输出) ,与 tar 相类似。rpm 最初由 Red Hat 开发,并向开放源代码团体发布,它是专用的 存档工具,用于打包应用程序软件。
为便于介绍这些工具,本文重点讨论在单用户系统中存档文件。这就意味着备份您的 /home 目录,也可能要备份 /etc 目录中的某些配置文件,这些目录定期更改,如果遇 到问题,它们最难替换。
虽然可以利用 tar 等工具来运行系统备份或数据文件备份,但 在这里不会讨论这些过程,只是如果您使用 Oracle 集群文件系统 (OCFS) 进行备份, 则需要到 oss.oracle.com 下载最新的工具,以便能够使用 tar 备份您的 Oracle 数据 库文件。如果您使用第三方工具进行数据库备份,可能仍然需要这样做,因为某些第三 方数据库备份程序使用 tar。
使用 tar 存档实用程序(如 tar 和 cpio)以其能够保持关联文件信息而为众人所知:目录结构 、文件内容、所有权和模式(权限)设置。(参见我以前的文章“Linux 文件命令精通 指南”,获得关于文件访问权限的解释。)这样允许您存储一个文件系统,并按照您对 其进行存档时的情况确切地重建该文件系统。
对于用户控制的备份或单用户系统,tar 应该是最佳的备份工具。其基本的命令语法是 :
tar mandatory_operation [options] nameoftarfile.tar file(s)_to_archive mandatory_operation
是在 tar 手册页上列出的八项“功能字母”之一。当您调用 tar 时,首先必须确切唯一指定这些“操作”中的一个。这些操作中最常见的是
--create(-c)、--list (-t) 和 --extract (-x)。
两个常用“选项”是 --verbose (-v) — 在 tar 处理文件时,它打印这些文件的列 表,以及 --file (-f) — 它指定存档文件的名称。虽然这些选项不是必需的,但它 们对于消除混乱而言极为重要。
tar 选项和操作可接受三种格式:短格式、助记格式和旧格式。短格式使用单个字母,
如下所示:
$ tar -cvf document..tar document.
document./
document./zz/
document./zz/new_file.out
document./samplesql/
document./samplesql/mksample8.sql
document./samplesql/oe8_cre.sql
document./samplesql/oe8_drop.sql
document./samplesql/hr8_cre.sql
助记格式使用长的名称,如
$ tar --create --verbose --file document..tar document.
来完成同样的工作。旧格式类似于短格式,但不使用前导破折号:
$ tar cvf document..tar document.
上述命令均执行相同的两个任务:
它们为目录 document. 创建一个 tar 文件,该目录包含两个子目录 在将文件添加到存档 document..tar 时,这些命令打印每个文件的名称 一个重要却经常混淆的概念是,如果没有使用 -C --directory=DIR 选项进行指定,tar
存档将在调用 tar 的目录(即工作目录)中创建的,而不是被存档的文件所在的目录。
格式可以混合,例如
$ tar cv --file document..tar document.
在 tar 命令中的选项顺序对于清晰性而言很重要。以下命令将创建一个名为“v”的存 档。
$ tar -cfv archive.tar document.
使用助记格式可以减轻这种混淆。
存档的命名没有要求,但是按照惯例,命名 tar 文件要带有 *.tar 扩展名。后面讨论 的 gzip 存档通常命名为 *.tar.gz 或 *.tgz。
存档内部一瞥
那么,现在事情变得很有趣。在您创建一个 tar 文件之后,您就可以使用 -t,--list
选项了解其内部情况:
$ tar -tf document..tar
此命令将输出一个列表,它与您运行 tar -cv 时所输出的列表类似。在解压缩下载的 tar 文件之前,最好先获取其列表,以确保文件不会以“/”开始,而表示绝对的路径名 。
您可以使用 tar -t 来查找单独的文件。
$ tar -tf document..tar document./samplesql/mk*.sql
document./samplesql/mksample8.sql
这个方法也适用于目录。
$ tar -tf document..tar document./samplesql
document./samplesql/
document./samplesql/mksample8.sql
document./samplesql/oe8_cre.sql
document./samplesql/oe8_drop.sql
...
结合使用 -v 选项与 --list,可以生成您的 tar 组件的长文件列表。
$tar -tvf document..tar document./samplesql
列出 tar 内容便于你查找您要解压缩的单个文件的确切名称。您还可以看到 tar 自动 保留了更改日期和其他文件信息。
要找出文件系统与现有 tar 文件之间的区别,请调用 tar是使用 -d, --diff 选项。
$ tar -dvf document..tar
document./samplesql/
document./samplesql/mksample8.sql
tar:document./samplesql/oe8_views.sql:Warning:Cannot stat:No such file or
directory
document./samplesql/hr8_analz.sql:Mod time differs
document./samplesql/hr8_analz.sql:Size differs
document./samplesql/getdate.sql
tar:document./samplesql/getdate.sql:Warning:Cannot stat:No such file or
directory
...
在这个示例中,tar 报告在存档中有一个文件 hr8_analz.sql 与文件系统版本不同,有两个文件 oe8_views.sql 和 getdate.sql 存在于 tar 存档中,但不存在于文件系统中 。
Tar 将忽略目录中上次创建存档以后所创建的文件。但是,更新存档的方法很简单,您 将在下一章节中了解这种方法。
向存档添加文件
您可以利用 -r, --append 选项将新文件添加到现有存档。
$ tar -rvf document..tar document./samplesql
此命令将把整个目录添加到存档中。可以使用以下命令将单个文件添加到存档中:
$ tar -rvf document..tar document./samplesql/getdate.sql
document./samplesql/getdate.sql
由于 tar 最初是磁带存档工具,利用 --append 或 --update 来更新存档只是将被更改的文件添加到现有存档,而不会删除旧的文件。-N, --newer 选项可用于创建新文件和被更改文件的增量存档。基本上,在规则基础上重新创建存档可能是维护最新存档的最 简易方法。
备份大量数据
对于大量数据,您可以使用 -M (--multivolume) 选项将 tar 输出发送到其他介质,如磁带、CD-ROM 或软盘,或者使用 tar 所提供的压缩工具进行压缩。但是,您不能两种 方法一起使用;这样做会使您的存档毫无用处。
tar 的传统 UNIX 版本不支持 zip 压缩,尽管所存档的文件可以(并且现在仍然可以) 利用管道传输到压缩工具。利用 GNU tar,在调用 tar 时加上选项可以指定压缩方法。
Tar 支持三种可选的压缩方法:
compress/uncompress (-Z, --compress/--uncompress)
gzip/gunzip (-z, --gzip/--gunzip)
bzip2/bunzip2 (-j, --bzip2/--bunzip2).
根据 GNU 项目,compress 是在商业 UNIX 发布版本中一种较老的专用压缩实用工具, 是出于兼容的目的而在 Linux 中提供的。Gzip 从 1997 年初开始在 tar 的 GNU 版本 中提供;它可以解压缩那些使用 compress 压缩的文件,并且被认为一种较好的选择,
原因如下:
它结合了 UNIX tar 和 compress 命令
使用它不会侵犯可能的专利权
它比 compress/uncompress 更高效。
Bzip2/bunzip2 是另一个可选实用工具,它提供比 gzip 更高效(虽然较慢)的压缩。
一旦利用压缩过滤器创建了一个存档:
$ tar -czvf document..tar.gz
以后对该存档操作时,都必须通过该过滤器。要列出存档的内容,需执行:
$ tar -tzvf document..tar.gz
要在存档上获取 --diff,需执行
$ tar -dzvf document..tar.gz
或者,要对存档进行 --extract 操作,我们将在稍后讨论。
解压缩 tar 存档
通过运行带有 --extract (-x) 操作的 tar,您可以解压缩整个目录或单个的文件。
$ tar -xvf Samplesql.tar getdate.sql
或
$ tar -xvf document..tar document./samplesql
这些解压缩操作在工作目录中创建文件。如果您正在处理 gzip 存档,切记在运行解压缩操作时指定 z。
$ tar -xzvf articles.tar.gz
$ tar -xzvf articles.tar.gz *.doc
警告:当您执行 extract 时要验证您正处在哪个目录中。您需要转至目标目录 (cd) 或 利用 -C 选项来指定它。
使用 Cpio
在 UNIX 世界中,Cpio 在 tar 前出现。与 tar 相似,它将文件存档到硬盘、软盘、 CD-ROM 或磁带中。在所处理的文件类型方面,它比 tar 更全面。cpio 的 GNU 版本将 文件拷贝到 cpio 或 tar 存档中,或将文件从中拷贝出来。它识别和处理特殊的格式, 如 HPUX 二进制、旧的 ACSII、新的 ASCII 以及一些其他的格式。它还可用于移动整个 目录树。为了与较老的 cpio 程序兼容,cpio 以二进制格式存储其存档文件。
该命令的一般格式为:
cpio -mode[other_options] [redirection_symbol] filename
它接受来自标准输入的显式文件列表,因此通常用在以 ls 或 find 开始的管道末端。
您可以三种基本模式使用 cpio:
拷贝输出模式,使用 -o 选项,将文件拷贝到存档
拷贝输入模式,使用 -i 选项,从存档中解压缩文件
拷贝传递模式,使用 -p 选项,将文件从一个目录树拷贝传递到另一个目录树。
根据您所运行的模式,可以使用不同的 cpio 选项。每种模式所允许使用的选项的完整列表可参考 cpio 手册页的“纲要”部分。
拷贝输出模式
与 tar 不同,cpio 需要显式的指令:哪些文件要利用标准输出进行存档,将存档重定 向到哪里,是否应该保留关联文件信息等等。拷贝输出模式可以利用以下命令来存档一 个目录的内容
$ ls | cpio -ov > samplesql.cpio
其中 ls 为 cpio 生成标准输出,用于拷贝输出到存档。-o, --create 选项指示 cpio
将输出进行存档,而 -v, --verbose 选项提供一个与 tar 相类似的列表。
您还可以使用 find 命令将文件送到 cpio。
$ find .-print -depth | cpio -ov > document..cpio
为了尽量减少目录权限问题,可使用 find 的 -depth 选项。该选项在目录本身处理内 容之前先处理该目录的内容,允许在恢复目录权限之前,在没有所有者写权限的情况下 恢复目录的内容。
-t, --list 工具也可用于 cpio,甚至可以在 tar 存档上运行。
$ cpio -tv < Samplesql.tar
拷贝输入模式
使用拷贝输入模式来解压缩存档的内容。在本模式中,cpio 自动识别它正在读取哪种存档。这意味着它能够读取在具有不同字节顺序的机器上所创建的存档。
$ cpio -idv < ../samplesql.cpio
此外,cpio 与 tar 的不同之处在于,它将不恢复文件的最初更改时间,除非您指定 -m, --preserve-modification-time 选项:
$ cpio -idvm < samplesql.cpio
我们已经提到过,cpio 也可以从 tar 存档进行解压缩。
$ cpio -idv ? Samplesql.tar
虽然 cpio 不能处理 zip 压缩文件,但您可以在通过管道将文件送到 cpio 之前完成 zip 文件的解压缩。
拷贝传递模式
本模式是拷贝输出与拷贝输入模式的组合。主要的不同之处是它绕过了存档。它可以将 整个目录从一个位置移动到另一个位置,用法如下:
$ find .-depth -print0 | cpio --null -pvda testdir
注意 find 使用了 -print0 选项而不是在拷贝输出模式中使用 -print。GNU cpio 的拷 贝传递模式需要以 null 结束的文件,这是由 -print0 选项提供的服务。这种方法允许 cpio 处理那些包含换行符的文件名,并且在上面的 cpio 命令中加入 --null 选项。
-d, --make-directories 选项指示 cpio 创建目录 testdir。
Tar 可以完成相同的工作。但是,在本示例中,必须首先创建目录 testdir。
$ tar -cvf - samplesql | (cd testdir; tar -xf -)
Tar 可以完成相同的工作。但是,在本示例中,必须首先创建目录 testdir。
$ tar -cvf - samplesql | (cd testdir; tar -xf -)
在这里,tar 将存档送到标准输出,由第一个 tar 命令中的“-”指示。第二个 tar 命 令从标准输入中获取存档,以第二个 tar 命令中的“-”表示。在传递文件时,它们被 拷贝到 testdir,保留用户、权限和日期信息。
Rpm
Red Hat 和 SuSE Linux 分发版本都使用 rpm 来安装 Linux 操作系统和应用软件。它 可用于:
利用一个命令安装所有应用程序文件
管理已安装的程序包
更新程序包
利用一个命令卸载程序包
将软件程序包从源代码形式转换为源和二进制形式。
我们将在这里讨论除最后一个功能之外的所有功能。
查询 rpm
使用 -q, --query 选项获取关于 rpm 程序包的信息。结合 -q 与 -a 选项,以获取在 您的系统中安装的所有 rpm 程序包的列表。
$ rpm -qa | more
或者,为获得更有序的结果,
$ rpm -qa | sort | grep k | more
如果您利用了 cpio、tar、Oracle Universal Installer 或任何其他安装程序来安装程 序包,则该程序包将不会在本列表中。您可以利用以下命令找到任何已安装的 rpm 程序 包的版本:
$ rpm -q glibc
glibc-2.2.5-177
Rpm -qi 附带一个程序包名称,可以提供关于特定程序包的更多信息:
$ rpm -qi orarun
此命令将输出该程序包的详细描述信息。要找到一个程序包所安装的所有文件的列表, 可以使用:
$ rpm -ql orarun
/etc/init.d/oracle
/etc/profile.d/oracle.csh
...
但是,在您开始清理文件之前,最好先查明哪个程序包在使用特定文件。
$ rpm -qf /usr/sbin/rcoracle
orarun-1.3-0
利用 rpm 进行安装、更新的卸载
-i 选项指示 rpm 安装一个程序包。
$ rpm -iVh orarun-1.3-0.rpm
与 -h 选项结合使用时,-i 选项便利 rpm 在安装程序包时显示“#”标示符。这样您可 以了解到安装没有被挂起。
-V, verify 选项检查安装的问题。如果您试图安装一个已安装程序包的更新版本,会得 到一条错误消息。在这种情况下,您应该使用 -U 选项来更新程序包。
利用 -e 选项卸载 rpm 程序包:
$ rpm -e orarun
有些时候,当您卸载或安装程序包时,您会收到一条错误消息,说明缺少一个或多个的 相关程序包。要查看特定程序包的相关性列表,可使用命令:
$ rpm -qR orarun
/bin/sh
有些情况下相关性是相互作用的,以致于您似乎陷入自相矛盾的情况。解决方案是使用--nodeps 选项。
$ rpm -e --nodeps netscape
您可能会认为,如果不加选择地使用此命令,可能会导致出现问题。但是,有时这是唯 一的办法。对于 --force 选项也同样如此,此选项无论是否有冲突都会安装程序包,覆 盖当前的文件。
获得存档质量
尽管此处讨论的存档工具在功能上有些重叠,但它们各自具有特别的功能。它们也拥有 各自的拥护者和批评者。
rpm 和 tar 通常都用于发布软件程序包。除了其发布功能之外,tar 还经常用作备份实 用程序。但是,对于很多人来说,cpio 的简单性使其成为一种令人喜爱的备份工具。还 有一种称为 rpm2cpio 的工具,它将 rpm 程序包转换为 cpio 程序包,能够从 rpm 程 序包中解压缩一两个文件。有关更多信息,请参见“最大限度的 RPM:Red Hat Package Manager 终极应用”,作者 Edward C. Bailey。
使用 tar、cpio 和 rpm 或者其他安装程序的组合,能够在您的系统中安装不同的软件。大部分系统可能使用多种安装方法来安装不同的应用程序。但是,利用这种方法增加 了意外覆盖的危险。除非明确指定进行覆盖,cpio 会报告将要覆盖文件,而 tar 将会 直接进行覆盖操作。
那么,存档文件的最好工具是哪一种?就像信息技术领域中的大部分决策一样,没有简 单的答案。最好的解决方案将取决于您的需求、偏好以及策略。
如何分解打包软件?
# split -b 100k big.file
将big.file分解成若干500K的小文件 (名为xa, xb, xc, ...)
# split -l 500 big.file
将big.file分解成每个500 lines的小文件
其它使用方法参见split –h
============================================================
在Unix下如何压缩文件?
在unix下压缩方法有多种,可以参见gzip、gunzip、zcat、compress等工具文档,也可以参见上面所述的一些方法。下面仅以compress命令示例:
例如:需要将/filename的文件打包并压缩,需要做以下步骤:
1)打包
tar cvf filename.tar ./dir
2)压缩
compress filename.tar #生成filename.tar.Z文件
如果还原回原来的目录结构
1)解压缩
uncompress filename.tar.Z
3)解tar包
tar xvf filename.tar
如果unix命令参数不熟悉,一般也可以通过ftp将压缩或打包文件传到PC上,利用Windows下的Winzip或rar等压缩工具解开。
==========================================================
如何解开和生成其他包如.jar文件?
在unix上生成和解开jar包和对tar包的操作差不多。
例如:
jar cvf filename.jar /dirname #将/dirname 打成jar包
jar xvf filename.jar #解开jar包
jar tvf filename.jar #只列表不解开jar包
阅读(2205) | 评论(0) | 转发(0) |