然而用 cat 将一个文件的内容读取至另一个文件是让系统创建了一个新文件。这些新文件取决于你的默认 umask 设置。要了解 umask 更多的知识,请阅读 Alex Juarez 讲述 umask 以及权限概览的文章。
运行 unmask 获取当前设置:
$ umask 0002
这个设置代表在该处新创建的文档被给予 664 (rw-rw-r-- )权限,因为该 unmask 设置的前几位数字没有遮掩任何权限(而且执行位不是文件创建的默认位),并且写入权限被最终位所屏蔽。
当你使用 cat 复制时,实际上你并没有真正复制文件。你使用 cat 读取文件内容并将输出重定向到了一个新文件:
$ cat foo.jpg > baz.jpg $ ls -l -G -g -rw-r--r--. 1 57368 Jul 29 13:37 bar.jpg -rw-rw-r--. 1 57368 Jul 29 13:42 baz.jpg -rw-r--r--. 1 57368 Jul 25 23:57 foo.jpg
如你所见,cat 应用系统默认的 umask 设置创建了一个全新的文件。
最后,当你只是想复制一个文件时,这些手段无关紧要。但如果你想复制文件并保持默认权限时,你可以用一个命令 cat 完成一切。
rsync
有着著名的同步源和目的文件的能力,rsync 命令是一个复制文件的多才多艺的工具。最为简单的,rsync 可以类似于 cp 命令一样使用。
$ rsync example.txt example_copy.txt $ ls example.txt example_copy.txt
这个命令真正的威力藏在其能够不做不必要的复制的能力里。如果你使用 rsync 来将文件复制进目录里,且其已经存在在该目录里,那么 rsync 不会做复制操作。在本地这个差别不是很大,但如果你将海量数据复制到远程服务器,这个特性的意义就完全不一样了。
甚至在本地中,真正不一样的地方在于它可以分辨具有相同名字但拥有不同数据的文件。如果你曾发现你面对着同一个目录的两个相同副本时,rsync 可以将它们同步至一个包含每一个最新修改的目录。这种配置在尚未发现版本控制威力的业界十分常见,同时也作为需要从一个可信来源复制的备份方案。
你可以通过创建两个文件夹有意识地模拟这种情况,一个叫做 example 另一个叫做 example_dupe :
$ mkdir example example_dupe
在第一个文件夹里创建文件:
$ echo "one" > example/foo.txt
用 rsync 同步两个目录。这种做法最常见的选项是 -a (代表 “archive”,可以保证符号链接和其它特殊文件保留下来)和 -v (代表 “verbose”,向你提供当前命令的进度反馈):
$ rsync -av example/ example_dupe/
两个目录现在包含同样的信息:
$ cat example/foo.txt one $ cat example_dupe/foo.txt one
如果你当作源分支的文件发生改变,目的文件也会随之跟新:
$ echo "two" >> example/foo.txt $ rsync -av example/ example_dupe/ $ cat example_dupe/foo.txt one two
注意 rsync 命令是用来复制数据的,而不是充当版本管理系统的。例如假设有一个目的文件比源文件多了改变,那个文件仍将被覆盖,因为 rsync 比较文件的分歧并假设目的文件总是应该镜像为源文件:
$ echo "You will never see this note again" > example_dupe/foo.txt $ rsync -av example/ example_dupe/ $ cat example_dupe/foo.txt one two
如果没有改变,那么就不会有复制动作发生。 (编辑:上饶站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|