概述
关于本系列
典型的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将其复制到文件中。 更有用的是,您可以将文件复制到标准输出中,然后使用管道从标准输入中提取文件,然后将文件从一个位置复制到另一位置。 由于cp
命令不支持-R
命令行选项,因此tar
命令通常在复制和重新创建系统上的非标准文件类型方面也更加可靠。
例如, 清单5显示了如何将文件从当前目录复制到现有目录。
清单5.将文件从当前目录复制到现有目录
$ tar cf - . | (cd DIR; tar xf - )
清单5可以按以下方式进行剖析:
-
tar cf - .
为当前目录中的文件创建一个新存档,以标准输出格式。 -
cd DIR
更改目录。 请注意,在开始将文件复制到该目录之前,该目录应该存在。 -
tar xf -
从标准输入中提取文件。 - 通过将上述两个组件放在括号中,可以有效地将它们视为一个命令,而不是两个,并且在提取归档文件之前执行
change directory
命令。 - 两者之间的管道(|)将第一个tar的标准输出馈送到第二个tar的标准输入中,从而有效地将文件复制到不存在的存档文件中,然后再复制出。
如果您明确指定路径,则tar
命令将保留归档中包含的文件的完整路径。 清单6使用明确的路径将文件复制到存档中,这意味着它们只能在原始位置恢复到任何位置。
清单6.明确指定路径
$ tar cf myhome.tar /home/mc
某些tar变体包含对剥离前导正斜杠的支持,使您可以在任何位置提取文件。 为了确保始终可以将文件放在所需的位置,应该使用清单7从当前目录添加文件。
清单7.从当前目录添加文件
$ cd /home/mc
$ tar cf myhome.tar .
tar
命令与cp
相比有一个优点,即可以通过添加v
命令行选项以打开详细模式来监视文件在源和目标之间复制时的传输。 通常,最好在提取文件而不是创建文件的命令部分上使用此命令,因为这可以确保文件已正确复制,而不是确认已正确读取文件(请参见清单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
./.bash_vars
./.bashrc
./xmlsimple.pl
./rest.xml
46 blocks
.
.bash_aliases
.bash_history
.bash_path
.bash_profile
.bash_vars
.bashrc
xmlsimple.pl
rest.xml
46 blocks
由于在命令的两个部分中都使用了详细模式,因此可以确认创建和提取的归档文件的大小是否相同。 在这种情况下,两个操作都使用46个块。
请注意,如果cpio具有相同或更新的修改时间,它们将不会覆盖目标上的文件。
通过网络复制
在UNIX中通过网络传输文件的一种明显方法是使用网络文件系统(NFS)挂载远程目录并在它们之间进行复制。 这是一个简单的解决方案,但并非在所有情况下都总是可行或可行的。
通过网络复制文件的最简单方法之一是使用tar或cpio创建存档文件,然后可以通过网络进行传输。 该方法具有一些优点,例如,复制文件的方式和时间的灵活性,但是也具有缺点,包括复制过程的复杂性以及在创建文件时都需要磁盘空间来存储文件的完整副本。存档在源上以及将存档复制到目标时。
如您所见,创建存档很简单:
清单14.创建一个档案
$ tar cf mydir.tar .
然后,您可以使用适当的方法来复制文件,例如,使用cp和NFS复制文件,或者使用FTP或SFTP传输到远程系统。
但是,归档文件方法不是特别有效的方法。 您可以通过使用压缩来提高效率。
使用压缩
如果要使用cpio或tar创建归档文件,并通过慢速链接(例如WAN或Internet而不是LAN环境)将文件复制到目标位置,则可以通过压缩归档文件来节省时间,转让。 选择正确的压缩格式将取决于所需的压缩级别。
存档方法很简单。 您可以在创建存档后执行此操作,如清单15所示。
清单15.归档后存档创建
$ tar cf mydir.tar .
$ bzip2 mydir.tar
您也可以使用管道来生成压缩版本的归档文件(参见清单16 )。
清单16.使用管道生成压缩版本的档案
$ tar cf - .| bzip2 >mydir.tar.bz2
清单16中的方法的优点是可以与tar,cpio的所有版本或任何其他存档工具一起使用。 它还可以在各种不同的平台上工作,其中tar的不同变体可能支持也可能不支持嵌入式压缩。 如果安装了GNU tar版本,则可以使用tar的z
命令行选项使用Gzip进行压缩(请参见清单17 )。
清单17.在tar中使用z
命令行选项
$ tar zcf mydir.tar.gz .
在系统之间复制目录的另一种方法是使用清单16中所示的管道解决方案,然后使用远程shell工具作为目标。
直接通过网络复制
您可以通过将典型tar
或cpio
命令的输出通过远程外壳(例如,远程外壳(rsh)或安全外壳(ssh))通过管道传输来直接通过网络进行复制。 您使用哪种远程Shell技术完全取决于您环境中可用的Shell。 前者rsh是提供基本身份验证安全性但不提供加密的标准远程外壳系统,而后者ssh提供数据的身份验证和加密。
两种方法都使用相同的基本命令行结构(请参见清单18 )。
清单18.直接通过网络复制
$ tar cf - ./*|rsh remotehost tar xf - -C /remotedir
该命令与本地化的tar相似,区别在于目标tar
命令正在远程系统上执行。 该系统的工作是由于两个命令之间的管道。
请记住,根据您的远程外壳程序配置,您可能需要在此过程中输入密码才能在远程计算机上进行身份验证。 ssh也可以使用相同的过程。 清单19指定了用户/主机组合。
清单19.指定用于在远程计算机上进行认证的用户/主机组合
$ tar cf - ./*|ssh user@remotehost tar xf - -C /remotedir
为了通过慢速链接获得更好的性能,应该使用压缩,如清单20所示。
清单20.直接通过网络复制时使用压缩
$ tar czf - ./*|ssh user@remotehost tar xzf - -C /remotedir
rsh和ssh都有更简单的命令行表亲,可以使从远程系统进行复制的过程更加简单。 例如,对于rsh的表亲rcp,您将使用清单21 。
清单21.使用rcp复制远程系统
$ rcp -r filename remotehost:/remotedir
您必须使用-r
命令行选项来递归复制目录。
ssh的表兄弟scp
命令使用相同的结构(请参见清单22 )。
清单22.使用scp
$ scp -r filename remotehost:/remotedir
通过网络同步
以上所有解决方案都与本地和通过网络复制文件有关。 但是,它们在每次复制时都依赖于复制整个目录结构,而这种复制并非总是必要的。 有时,您只需要复制自上次执行复制以来已更改的文件,本质上是同步,而不是完整的复制。
如果使用的是tar或cpio,则可以通过显式指定要包含在归档文件中的文件来实现基于时间的同步。 例如,如果您正在通过cron运行同步作业,则可以使用类似这样的命令来创建一个仅包含最后一天更改的文件的归档文件(请参见清单23 )。
清单23.创建一个仅包含最后一天更改的文件的档案
$ tar cf archive.tar `find . -mtime -1 -type f`
find
命令查找在过去一天中更改已更改的文件。 我只选择文件,因为如果包含目录,那么tar会包含该目录中的所有文件,并且包含的信息超出了存档文件中所需的信息。
为了实现更强大的同步,您可以使用rsync工具,这是一个免费的软件实用程序,可以通过网络有效地交换文件。 rsync工具是复制和同步文件的有效方法,尤其是在速度较慢的链接上。
摘要
在UNIX中复制文件和目录树时,无论是在同一系统上还是在任何类型的网络上的系统之间,都可以使用多种不同的工具和选择。 您使用哪种工具取决于您的实际情况和环境。 我倾向于使用tar,因为它是我使用的不同UNIX系统范围内最兼容的工具。 对于Linux®环境中的用户,scp工具(大多数Linux发行版中的标准组件)可能更合适。
翻译自: https://www.ibm.com/developerworks/aix/library/au-satdirmigration.html
最后
以上就是无限小土豆为你收集整理的unix迁移linux_迁移和移动UNIX目录树的全部内容,希望文章能够帮你解决unix迁移linux_迁移和移动UNIX目录树所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复