同步 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 日之后修改过的文件的拷贝。

通过与 rsh 或 ssh 结合使用,还可以把文件同步到远程主机:$ tar cfp - ./etc |(ssh user@host -- tar xfp -)。按照这种方式使用 ssh 和 tar 是在远程主机上创建本地文件备份的好方法。但是,还有更高效的信息同步方法。

  • 1
  • 2
  • 3
  • 4
  • 下一页

相关内容