有时候,您需要将整个 UNIX 目录树复制到相同系统中其他的位置或不同的系统。有许多种不同的方法可以完成这项操作,但并非所有的方法都可以保持信息数量不变或兼容于不同的系统。本文讨论了 UNIX 中各种可用的选项,以及如何最好地使用它们来完成相应的任务。
关于本系列
通常,UNIX® 管理员都拥有一套常用的辅助进程管理的关键实用工具、诀窍和系统。本文提供了各种用于简化各个过程的关键实用工具、命令行链和脚本。这些工具中的一部分来自于操作系统,而大部分的诀窍则来源于长期的经验积累和减轻系统管理员的工作压力的要求。本系列文章主要专注于最大限度地利用各种 UNIX 环境中可用的工具,包括简化异类环境中的管理任务的方法。
使用 cp
如果您使用 -r 命令行选项递归到其子目录中,标准的 cp 命令可用于复制整个目录树。该选项将对非标准的文件执行未知的操作。有些 UNIX 变种和 GNU cp 工具支持 -R 选项,使用该选项可以正确地复制命名管道、链接和其他的文件。
对于最简单的应用,cp 命令可以将目录复制到具有不同名称的新目录(请参见清单 1)。
FJELinux联盟
清单 1. cp 命令—将一个目录复制到具有不同名称的新目录FJELinux联盟
FJELinux联盟
然而,当在 cp 命令中指定源文件和目标位置时,您应该加以小心,因为其处理方式可能对结果有很大的影响。例如,假设您希望将目录 /home/mc 复制到目录 /export/home/mc。如果 /export/home/mc 不存在,那么清单 2 会将目录 /home/mc 复制到 /export/home/mc。
FJELinux联盟
清单 2. 在 cp 命令中指定源文件和目标位置FJELinux联盟
$ cp -r /home/mc /export/home/mc
|
FJELinux联盟
然而,如果 /export/home/mc 已经存在,那么清单 2 会将目录 /home/mc 复制到这个目录中,并创建新的目录 /export/home/mc/mc。
要将一个目录中的内容复制到一个已有的目录中,可以选择源目录中的文件,如清单 3 所示。
FJELinux联盟
清单 3. 将一个目录中的内容复制到一个已有的目录中FJELinux联盟
$ cp -r /home/mc/* /export/home/mc
|
FJELinux联盟
cp 工具有一个非常有用的选项,-p 命令行选项,它还可以确保维持每个文件的权限和所有权。
使用 tar
tar 命令最初用来将文件归档到磁带(确切地说,是磁带驱动器)。例如,您可以使用清单 4 中的命令,将当前目录中的文件复制到磁带上。
FJELinux联盟
清单 4. 使用 tar 将当前目录中的文件复制到磁带FJELinux联盟
FJELinux联盟
可以对清单 4 进行如下分析:
c 选项创建一个新的存档。 f 选项使用命令行中的下一个选项作为目标名称。在这个示例中,使用第一个原始磁带设备 (/dev/rmt0)。您还可以使用其中所有的信息创建一个 tar 文件。 . 告诉 tar 将所有的文件和目录(以及当前目录下所有的文件和目录)添加到这个存档文件中。
然而,除了可以将文件和目录结构复制到磁带,您还可以使用 tar 将它们复制到一个文件。更有用的是,您可以将文件复制到标准输出,然后可以使用管道从标准输入中提取这些文件,并将它们从一个地方复制到另一个地方。通常在系统中复制和重新创建非标准的文件类型时,tar 命令更加可靠,因为 cp 命令不支持 -R 命令行选项。
例如,清单 5 显示了如何将文件从当前目录复制到一个已有的目录。
FJELinux联盟
清单 5. 将文件从当前目录复制到一个已有的目录FJELinux联盟
$ tar cf - . | (cd DIR; tar xf - )
|
FJELinux联盟
可以对清单 5 进行如下分析:
tar cf - . 对当前目录中的文件创建一个新的存档,输出到标准输出。 cd DIR 更改了目录。请注意,这个目录在进行文件复制之前应该已经存在。 tar xf - 从标准输入中提取文件。 - 通过使用圆括号将上面的两个部分括起来,可以有效地将它们作为一个而不是两个命令来处理,并且
cd 命令在提取存档之前进行。 - 两者之间的管道 (|) 将第一个 tar 的标准输出传入到第二个 tar 的标准输入,并且高效地将文件复制到一个并不存在的存档文件,然后再从其中提取文件。
如果您显式地指定了路径,那么 tar 命令可以保持存档中所包含的文件的完整路径。清单 6 使用显式的路径将文件复制到存档中,这意味着,不能将这些文件提取到其他的地方,只能返回到它们的初始位置。
FJELinux联盟
清单 6. 显式地指定路径FJELinux联盟
$ tar cf myhome.tar /home/mc
|
FJELinux联盟
有些 tar 变种可以去掉开头的正斜杠,这使得您可以将文件提取到任何位置。要确保总可以将文件放到需要的位置,您应该使用清单 7 中的命令从当前目录中添加文件。
FJELinux联盟
清单 7. 从当前目录添加文件FJELinux联盟
$ cd /home/mc
$ tar cf myhome.tar .
|
FJELinux联盟
与 cp 相比,tar 命令有一个优点,那就是通过添加 v 命令行选项以打开详细模式,您可以在将文件从源复制到目标的过程中监视文件的传输。通常,最好是在提取文件的 tar 命令中使用这个选项,而不是在创建存档的 tar 命令中使用,因为它可以确保正确地对文件进行复制,而不是证实对其进行了正确的读取(请参见清单 8)。
FJELinux联盟
清单 8. 添加 v 命令行选项FJELinux联盟
$ tar cf - .|(cd /tmp/mc; tar xvf -)
./
./.bash_aliases
./.bash_history
./.bash_path
./.bash_profile
./.bash_vars
./.bashrc
./xmlsimple.pl
./rest.xml
...
|
FJELinux联盟
请注意,如果系统的 tar 不支持长路径名,那么它可能不支持更新的 tar 格式。GNU tar 支持新的 tar 格式,并且支持长的或者非常深的路径名。
缺省情况下,大多数 tar 变种可以正确地复制和重新创建文件和目录,并保持相同的所有权和权限信息,然而,如果作为 root 用户运行,那么有些变种会改写这个信息,并在提取文件的时候改变其所有权。您可以使用 p 选项确保保持相应的权限和所有权(请参见清单 9)。
FJELinux联盟
清单 9. 使用 p 选项FJELinux联盟
$ tar cpf - .|(cd /tmp/mc; tar xvpf -)
|
FJELinux联盟
最后,您还可以通过扩展这个命令的后半部分(请参见清单 10),创建一个新的目录作为复制这些文件的目标。
FJELinux联盟
清单 10. 创建一个新的目录作为复制文件的目标FJELinux联盟
$ tar cpf - .|(mkdir /tmp/mc; cd /tmp/mc; tar xvpf -)
|
FJELinux联盟
就其本身而言,tar 是一种非常有用的工具,可用于复制文件和目录结构。然而,当您使用它通过网络来复制文件时,才能真正体现出它的价值。在研究这种诀窍之前,先来使用另一种存档工具 cpio,这也是一种基本的处理方法。
使用 cpio
cpio 工具类似于 tar 工具,但是除了接受指定的文件或目录之外,您必须为它提供一个文件列表。如果您只希望复制特定的文件,那么这个工具可能更加实用。例如,要创建一个包含特定目录的 cpio 存档,您可以使用清单 11 中的命令。
FJELinux联盟
清单 11. 创建包含特定目录的 cpio 存档FJELinux联盟
$ ls ./dira ./dirc |cpio -ov > diranc.cpio
|
FJELinux联盟
这个命令的 ls 部分输出将要复制的文件列表(在本示例中是两个目录中的内容)。后半部分是用于将它们复制到存档中的 cpio 命令。对这个命令进行分析,其中包括两个选项:
o 选项将文件复制到存档。 v 选项在复制文件时显示文件列表,这可用于对复制过程进行确认。
通过将 cpio 的输出重定向到一个新的文件,可以创建实际的存档。
上面的命令存在一定的局限,它只能复制那些显式列出的文件。要复制整个目录,最好的方法是使用 find 命令(请参见清单 12)。
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论