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