同步 UNIX 文件

有许多工具可以用来跨 Unix?目录同步文件,但是要想有效且安全地完成这个任务,就需要多做一些工作 。本文介绍跨 UNIX 文件系统和不同的计算机系统安全地同步文件的解决方案,包括如何为了执行备份同步文件的加密版本 。
文件同步就是在一个位置添加、修改或删除文件时,在另一个位置添加、修改或删除同一个文件的过程 。本文讨论三个实用程序,cp、tar 和 rsync,它们都有助于同步 UNIX 文件 。cp 和 tar 命令的同步功能有限,而 rsync 提供很全面的选项;尽管如此,它们都有各自适用的场合 。
用 cp 命令执行直接复制
尽管 cp 命令并不是真正的同步命令,但它可能是在两个位置之间复制文件的最简单方法 。对于单一文件复制,cp 显然是非常高效的:$ cp source destination 。
要想复制整个目录结构,可以使用 -r 选项递归地把整个目录结构从一个位置复制到另一个位置:$ cp -r source destination 。这种复制方法仅仅递归地复制文件和目录 。文件的权限、所有者和其他元数据并不会复制到目标位置 。可以使用 -p 选项保留复制的每个文件和目录的所有者、权限和时间:$ cp -pr source destination 。
使用 cp 命令是最容易最公认的文件复制方法,但是 cp 的效率很低,而且如果不使用 NFS 这样的远程文件系统解决方案,就不可能把目录复制到远程系统上 。
使用 tar
tar(tape archive 的简写)实用程序原来用于高效地把目录结构(包括文件和文件元数据)转换为二进制流,然后就可以把二进制流写到备份磁带上 。
通常使用 tar 创建一个包含所需目录的 .tar 文件:$ tar cf mydir.tar ./mydir 。c 选项让 tar 创建新的存档文件,f 选项使用后面的参数指定要创建的存档文件的名称 (mydir.tar) 。其余参数指定应该包含在存档文件中的文件或目录 。tar 命令自动地递归遍历目录结构,所以如果指定包含一个目录,tar 将在存档文件中包含这个目录以及其中的所有文件和目录 。
tar 的一个重要特点是,用户指定的路径名被看作绝对路径 。也就是说,如果为 tar 指定完整的目录位置,例如 /etc 目录:$ tar cf etc.tar /etc 。那么,在默认情况下,tar 将把文件提取到它们的绝对位置 。例如,如果提取这个存档文件:$ tar xf etc.tar,就会在 /etc 目录中重新创建文件和目录结构 。这可能会产生破坏(可能会覆盖 /etc 中希望保留的文件) 。这个问题有两种解决方法 。第一种是使用 GNU tar,它支持通过 --strip-path 选项从提取的路径中删除元素 。
另一个简单的解决方法是进入父目录,然后使用相对路径(见清单 1) 。
清单 1. 进入父目录并使用相对路径
 $ cd /
$ tar cf etc.tar ./etc
在提取存档文件时,会在相对位置重新创建文件 。可以使用这种方法帮助同步目录 。因为 tar 创建目录结构的字节流,可以通过结合使用 tar 和管道把文件从一个位置复制到另一个位置:$ tar cf - ./etc |( cd /backup; tar xf - ) 。“- 指定 tar 应该使用标准输出(在写时)或标准输入(在读时) 。圆括号让语句在一个子 shell 中执行 。看一下管道符前面的代码,它创建文件的字节流并发送到标准输出 。在管道符后面,切换到另一个目录,然后从标准输入提取字节流 。
要想保留文件的所有者和权限,可以使用 p 选项保留每个文件和目录的元数据:$ tar cfp - ./etc |( cd /backup; tar xfp - ) 。
掌握这种基本结构之后,就可以执行更复杂的操作 。例如,可以只复制在特定时间之后修改过的文件:$ tar cf - --newer 20090101 ./etc |(cd /backup; tar xf - ) 。这个命令创建在 2009 年 1 月 1 日之后修改过的文件的拷贝 。

推荐阅读