1.tar
实用程序将一个或多个文件和目录打包为单个文件,并保持原始文件的大小、拥有者、权限、文件类型及其在文件系统层次结构中的位置。tar
实用程序将您的文件完整地记录到磁带中,tar
是磁带存档程序 (tape archiver) 的首字母缩写。
要为这两个文件和一个目录创建存档,可以运行下面的 tar
命令:
$ tar --create --verbose --gzip --file archive.tgz * css/ css/style.css css/valid.css demo.rb tech.pdf |
--create
选项告诉 tar
创建一个存档;--verbose
选项为 tar
所处理的文件生成一个列表;--gzip
选项启用 gzip 方式的压缩,这将缩小该存档的大小;而 --file archive.tgz
指定了存档的名称。
Shell 将星号 (*) 解释为“任何文件”,所以对其展开后为两个文件和一个目录。从上面的输出中您可以看出,tar
对 css 目录进行了存档,同时递归地对该目录中的内容进行了存档。
在运行 tar
命令之后,当前目录中包含了一个新的文件 archive.tgz:
$ ls -l archive.tgz -rw-r--r-- 1 mstreicher mstreicher 105470 Oct 13
17:16
archive.tgz |
现在,您可以将 archive.tgz 复制到另一台计算机,并在远程计算机上使用 tar
解压存档的内容。事实上,用来恢复文件的命令行与前面使用的命令行基本相同。要对这个存档进行解压,可以使用:
$ tar --extract --verbose --gunzip --preserve-permissions --file archive.tgz
|
这个 tar
命令将解压 archive.tgz 压缩文件中的内容。--extract
选项与 --create
选项正好相反;--gunzip
与 --gzip
相反,而 --preserve-permissions
将重新创建原始文件的权限。
2.联合ssh使用 tar
您可以组合使用 Secure Shell (SSH) 和 tar
命令,以将文件存档、复制和解压合并为一步操作。下面是完成这项工作的命令:
$ (cd ~/stuff; tar --create --gzip --file - *) | / ssh destination tar --extract --gunzip --file --verbose -C stuff |
该命令进行了很多操作,所以让我们对其进行分解:
- 命令中带圆括号的部分称为subshell。subshell 中进行的更改,例如更改目录,不会影响到您的命令行,但是它将影响 subshell 的执行环境。因此,第一个短语
(cd ~/stuff; tar --create --gzip --file - *)
更改到目录 ~/stuff,然后运行tar
。因为 subshell 后面跟着管道,所以 subshell 的所有输出都通过管道传输给了下一个命令。 - 与许多其他的 UNIX 实用程序一样,
tar
可以分别向标准输出 (stdout
) 写入、从标准输入 (stdin
) 读取。stdout
和stdin
通常表示为连字符 (-)。所以,短语--create --file -
在stdout
上创建存档。 - 管道 (|) 将 subshell 的所有输出通过管道传输给
ssh
。这样可以有效地将所有的输出从源计算机传输到目标计算机。 - 最后,目标计算机运行自己的
tar
实例对存档进行解压。然而,这里的--extract --file -
从标准输入 读取存档。-C
选项强迫接收方 的tar
在开始进行任何处理之前,将目录更改到 stuff(在远程 home 目录中)。最后的结果是,将通过ssh
传输的存档解压到 ~/stuff 中。
从远程计算机中获取创建的存档并解压到本地计算机。下面的命令可以实现这项任务,在本地计算机中运行:
$ ssh destination cat archive.tgz | / (cd ~/stuff; tar --extract --gunzip --file -) |
在远程计算机上打开远程存档,将 cat 产生的字节流发送到 subshell,这个 subshell 首先更改目录,
3. 在两台计算机之间传输文件的另一种方法是使用 scp
,即安全复制 (secure copy)。顾名思义,scp
的工作方式与普通的 cp
非常相似,它可以用来将文件从一个地方复制到另一个地方,可以在同一台计算机上或两台不同的计算机之间。
在这个示例中,cp -pr
递归地将所有的文件和目录复制到 /home/joe/stuff。-r
表示递归;-p
表示保持该文件的时间戳。
您可以使用 scp
完成相同的工作(即在本地进行复制):
$ scp -pr * /home/joe/stuff
|
但如果您指定了远程系统,那么 scp
可以通过网络复制文件:
$ scp -pr * destination:/home/joe/stuff
|
$ scp -pr ~/doc destination:/path/to/doc |
$ scp -pr ~/doc destination:/path/to/doc/ |
请注意,目标计算机上的目录没有尾部的斜杠 (/)。scp
将这个路径解释为“将 ~/doc 目录中的内容复制到目标计算机的 /path/to/doc 目录”。与 cp
一样,与本地文件和目录具有相同名称的远程文件和目录将被覆盖,而远程系统中所特有的文件将保持不变。
然而,如果您添加上尾部的斜杠
scp
将后面的这个路径解释为“将 ~/doc 目录复制到 /path/to/doc/ 目录”。所以,将本地 doc 目录复制到远程目录中,而不是覆盖远程目录的内容。尾部的斜杠并不是一个错误。有时您可能希望使用它,而有时您可能不希望使用它,这取决于实际情况。
4.Rsync:保持同步
其最大的优点在于,rsync
具有各种选项,要使得一个目录成为另一个目录真正的镜像,可以使用相应的选项删除原始目录中不存在的那些文件。让我们来看一些示例:
$ rsync -e ssh --times *.txt destination:
|
这个命令将当前工作目录中所有的文本文件复制到您在名为 destination 的计算机上的 home 目录中。-times
选项保持每个文件的访问权限、创建和最后修改时间。
$ rsync -e ssh --times --perms --recursive --delete doc destination:
|
这个变化的 rsync
命令在目标计算机上您的 home 目录中创建本地 doc 目录的镜像。同时保持文件的时间和权限,并且删除外来的文件(即,在本地目录中不存在的远程目录中的文件)。
因为 rsync
可能执行一些重要的更改,所以您可能希望为该命令行添加 --dry-run
选项,以便预览 rsync
计划完成哪些操作。--dry-run
并不进行任何更改,它仅仅显示将要执行的操作,如下面的清单 3 所示。
清单 3. 预览 rsync 将要执行的操作
$ rsync -e ssh --dry-run --times --perms --recursive --delete bin destination: building file list ... done bin/ skipping non-regular file "bin/HTML.pl" skipping non-regular file "bin/Quark.pl" bin/Responses/ bin/Responses/DBI.pm bin/Responses/Response.pm skipping non-regular file "bin/XML.pl" bin/backupdca.sh bin/lib/ bin/report.pl bin/report.txt sent 724 bytes received 108 bytes 554.67 bytes/sec total size is 168879 speedup is 202.98 |
rsync
具有许多选项:
-a
是非常有用的选项,因为它是--group --owner --perms --times --devices --links --recursive
的缩写。--devices
重新创建设备文件,而--links
将符号链接复制为符号链接,而不是复制符号链接所指向的内容。--update
可以防止rsync
覆盖较新的文件。如果远程系统具有比本地系统较新的文件,那么将会保留远程系统中的这个文件。- 可以尝试使用
--verbose
选项,以便在rsync
命令执行的过程中进行观察。