如何移动UNIX目录( 二 )


清单 6. 显式地指定路径
$ tar cf myhome.tar /home/mc
有些 tar 变种可以去掉开头的正斜杠 , 这使得您可以将文件提取到任何位置 。要确保总可以将文件放到需要的位置 , 您应该使用清单 7 中的命令从当前目录中添加文件 。
清单 7. 从当前目录添加文件
$ cd /home/mc
$ tar cf myhome.tar .
与 cp 相比 , tar 命令有一个优点 , 那就是通过添加 v 命令行选项以打开详细模式 , 您可以在将文件从源复制到目标的过程中监视文件的传输 。通常 , 最好是在提取文件的 tar 命令中使用这个选项 , 而不是在创建存档的 tar 命令中使用 , 因为它可以确保正确地对文件进行复制 , 而不是证实对其进行了正确的读取(请参见清单 8) 。
清单 8. 添加 v 命令行选项
$ tar cf - .|(cd /tmp/mc; tar xvf -)
./
./.bash_aliases
./.bash_history
./.bash_path
./.bash_profile
./.bash_vars
./.bashrc
./xmlsimple.pl
./rest.xml
...
请注意 , 如果系统的 tar 不支持长路径名 , 那么它可能不支持更新的 tar 格式 。GNU tar 支持新的 tar 格式 , 并且支持长的或者非常深的路径名 。
缺省情况下 , 大多数 tar 变种可以正确地复制和重新创建文件和目录 , 并保持相同的所有权和权限信息 , 然而 , 如果作为 root 用户运行 , 那么有些变种会改写这个信息 , 并在提取文件的时候改变其所有权 。您可以使用 p 选项确保保持相应的权限和所有权(请参见清单 9) 。
清单 9. 使用 p 选项
$ tar cpf - .|(cd /tmp/mc; tar xvpf -)
最后 , 您还可以通过扩展这个命令的后半部分(请参见清单 10) , 创建一个新的目录作为复制这些文件的目标 。
清单 10. 创建一个新的目录作为复制文件的目标
$ tar cpf - .|(mkdir /tmp/mc; cd /tmp/mc; tar xvpf -)
就其本身而言 , tar 是一种非常有用的工具 , 可用于复制文件和目录结构 。然而 , 当您使用它通过网络来复制文件时 , 才能真正体现出它的价值 。在研究这种诀窍之前 , 先来使用另一种存档工具 cpio , 这也是一种基本的处理方法 。
使用 cpio
cpio 工具类似于 tar 工具 , 但是除了接受指定的文件或目录之外 , 您必须为它提供一个文件列表 。如果您只希望复制特定的文件 , 那么这个工具可能更加实用 。例如 , 要创建一个包含特定目录的 cpio 存档 , 您可以使用清单 11 中的命令 。
清单 11. 创建包含特定目录的 cpio 存档
$ ls ./dira ./dirc |cpio -ov > diranc.cpio
这个命令的 ls 部分输出将要复制的文件列表(在本示例中是两个目录中的内容) 。后半部分是用于将它们复制到存档中的 cpio 命令 。对这个命令进行分析 , 其中包括两个选项:
o 选项将文件复制到存档 。v 选项在复制文件时显示文件列表 , 这可用于对复制过程进行确认 。通过将 cpio 的输出重定向到一个新的文件 , 可以创建实际的存档 。
上面的命令存在一定的局限 , 它只能复制那些显式列出的文件 。要复制整个目录 , 最好的方法是使用 find 命令(请参见清单 12) 。
清单 12. 使用 find 命令复制整个目录
$ find . |cpio -ov >archive.cpio
要从 cpio 存档中提取 , 可以使用 i 命令行选项 。您还应该使用 d 选项确保重新创建那些在存档中存在、而在目标结构中不存在的目录 。同时使用这两个选项 , 您可以将文件从一个目录复制到另一个目录 , 如清单 13 所示 。
清单 13. 同时使用 i 和 d 选项
$ find . |cpio -ov |(cd /tmp/mc; cpio -idv)
.
./.bash_aliases
./.bash_history
./.bash_path
./.bash_profile

推荐阅读