如何移动UNIX目录

有时候 , 您需要将整个 Unix 目录树复制到相同系统中其他的位置或不同的系统 。有许多种不同的方法可以完成这项操作 , 但并非所有的方法都可以保持信息数量不变或兼容于不同的系统 。本文讨论了 UNIX 中各种可用的选项 , 以及如何最好地使用它们来完成相应的任务 。
关于本系列
通常 , UNIX?管理员都拥有一套常用的辅助进程管理的关键实用工具、诀窍和系统 。本文提供了各种用于简化各个过程的关键实用工具、命令行链和脚本 。这些工具中的一部分来自于操作系统 , 而大部分的诀窍则来源于长期的经验积累和减轻系统管理员的工作压力的要求 。本系列文章主要专注于最大限度地利用各种 UNIX 环境中可用的工具 , 包括简化异类环境中的管理任务的方法 。
使用 cp
如果您使用 -r 命令行选项递归到其子目录中 , 标准的 cp 命令可用于复制整个目录树 。该选项将对非标准的文件执行未知的操作 。有些 UNIX 变种和 GNU cp 工具支持 -R 选项 , 使用该选项可以正确地复制命名管道、链接和其他的文件 。
对于最简单的应用 , cp 命令可以将目录复制到具有不同名称的新目录(请参见清单 1) 。
清单 1. cp 命令—将一个目录复制到具有不同名称的新目录
$ cp -r srcdir destdir
然而 , 当在 cp 命令中指定源文件和目标位置时 , 您应该加以小心 , 因为其处理方式可能对结果有很大的影响 。例如 , 假设您希望将目录 /home/mc 复制到目录 /export/home/mc 。如果 /export/home/mc 不存在 , 那么清单 2 会将目录 /home/mc 复制到 /export/home/mc 。
清单 2. 在 cp 命令中指定源文件和目标位置
$ cp -r /home/mc /export/home/mc
然而 , 如果 /export/home/mc 已经存在 , 那么清单 2 会将目录 /home/mc 复制到这个目录中 , 并创建新的目录 /export/home/mc/mc 。
要将一个目录中的内容复制到一个已有的目录中 , 可以选择源目录中的文件 , 如清单 3 所示 。
清单 3. 将一个目录中的内容复制到一个已有的目录中
$ cp -r /home/mc/* /export/home/mc
cp 工具有一个非常有用的选项 , -p 命令行选项 , 它还可以确保维持每个文件的权限和所有权 。
使用 tar
tar 命令最初用来将文件归档到磁带(确切地说 , 是磁带驱动器) 。例如 , 您可以使用清单 4 中的命令 , 将当前目录中的文件复制到磁带上 。
清单 4. 使用 tar 将当前目录中的文件复制到磁带
$ tar cf /dev/rmt0 .
可以对清单 4 进行如下分析:
c 选项创建一个新的存档 。f 选项使用命令行中的下一个选项作为目标名称 。在这个示例中 , 使用第一个原始磁带设备 (/dev/rmt0) 。您还可以使用其中所有的信息创建一个 tar 文件 。. 告诉 tar 将所有的文件和目录(以及当前目录下所有的文件和目录)添加到这个存档文件中 。然而 , 除了可以将文件和目录结构复制到磁带 , 您还可以使用 tar 将它们复制到一个文件 。更有用的是 , 您可以将文件复制到标准输出 , 然后可以使用管道从标准输入中提取这些文件 , 并将它们从一个地方复制到另一个地方 。通常在系统中复制和重新创建非标准的文件类型时 , tar 命令更加可靠 , 因为 cp 命令不支持 -R 命令行选项 。
例如 , 清单 5 显示了如何将文件从当前目录复制到一个已有的目录 。
清单 5. 将文件从当前目录复制到一个已有的目录
$ tar cf - . | (cd DIR; tar xf - )
可以对清单 5 进行如下分析:
tar cf - . 对当前目录中的文件创建一个新的存档 , 输出到标准输出 。cd DIR 更改了目录 。请注意 , 这个目录在进行文件复制之前应该已经存在 。tar xf - 从标准输入中提取文件 。通过使用圆括号将上面的两个部分括起来 , 可以有效地将它们作为一个而不是两个命令来处理 , 并且 cd 命令在提取存档之前进行 。两者之间的管道 (|) 将第一个 tar 的标准输出传入到第二个 tar 的标准输入 , 并且高效地将文件复制到一个并不存在的存档文件 , 然后再从其中提取文件 。如果您显式地指定了路径 , 那么 tar 命令可以保持存档中所包含的文件的完整路径 。清单 6 使用显式的路径将文件复制到存档中 , 这意味着 , 不能将这些文件提取到其他的地方 , 只能返回到它们的初始位置 。

推荐阅读