复印文件通常需要办公室中有专职人员,然后再有专用机器。 如今,复制是计算机用户无需考虑的一项任务。 在计算机上复制数据非常简单,以至于在没有意识到的情况下进行复制,例如将文件拖到外部驱动器时。
数字实体微不足道地复制的概念无处不在,因此大多数现代计算机学家都不会考虑可用于复制其工作的选项。 但是,有几种不同的方法可以在Linux上复制文件。 每种方法都具有细微差别的功能,这些功能可能会使您受益,具体取决于您需要完成的工作。
以下是在Linux,BSD和Mac上复制文件的多种方法。
在GUI中复制
拖放
复制文件最明显的方法是您可能在计算机上复制文件的方式:拖放。 在大多数Linux桌面上,默认情况下从一个本地文件夹拖放到另一个本地文件夹会移动文件。 您可以在开始拖动文件后按住Ctrl键,将这种行为更改为复制操作。
光标可能会显示一个指示符,例如加号,以表明您处于复制模式:
请注意,如果该文件存在于远程系统上,无论是Web服务器还是您通过文件共享协议访问的您自己网络中的另一台计算机,则默认操作通常是复制而不是移动文件。
右键点击
如果您发现桌面上的文件不精确或笨拙,或者这样做会使您的手从键盘上移开太多,通常可以使用右键单击菜单复制文件。 这种可能性取决于您使用的文件管理器,但是通常,右键单击会生成一个包含常用操作的上下文菜单。
上下文菜单复制操作将文件路径 (系统上文件所在的位置)存储在剪贴板中,因此您可以将文件粘贴到其他位置:
在这种情况下,您实际上并没有将文件的内容复制到剪贴板。 相反,您正在复制文件路径 。 粘贴后,文件管理器将查看剪贴板中的路径,然后运行复制命令,将位于该路径的文件复制到粘贴的路径中。
在命令行上复制
虽然GUI是复制文件的通常熟悉的方式,但在终端中进行复制会更有效。
cp
cp命令显然是基于终端的,等效于在桌面上复制和粘贴文件。 此命令复制文件和目录,并且相对简单。 它使用熟悉的源和目标语法(严格按此顺序),因此将名为example.txt的文件复制到您的Documents目录中:
$ cp example.txt ~/Documents
就像将文件拖放到文件夹上一样,此操作不会将examples.txt替换为Documents 。 而是, cp检测到Documents是一个文件夹,然后将example.txt的副本放入其中。
您还可以方便(高效)地在复制文件时重命名该文件:
$ cp example.txt ~/Documents/example_copy.txt
这个事实很重要,因为它使您可以在与原始文件相同的目录中复制文件:
$ cp example.txt example.txt
cp: 'example.txt' and 'example.txt' are the same file.
$ cp example.txt example_copy.txt
要复制目录,必须使用-r选项,该选项代表-recursive 。 此选项在目录inode上然后在目录中的所有文件上运行cp 。 如果没有-r选项, cp甚至无法将目录识别为可以复制的对象:
$ cp notes/ notes-backup
cp: -r not specified; omitting directory 'notes/'
$ cp -r notes/ notes-backup
猫
cat命令是最容易被误解的命令之一,但这仅是因为它体现了POSIX系统的极高灵活性。 在一切猫也会(包括CON 猫 enating文件挪作它用),它也可以复制。 例如,使用cat,您只需一个命令就可以从一个文件创建两个副本 。 您不能使用cp做到这一点。
使用cat复制文件的意义是系统解释操作的方式。 使用cp复制文件时,文件的属性与文件本身一起被复制。 这意味着副本的文件权限与原始文件的权限相同:
$ ls -l -G -g
-rw-r--r--. 1 57368 Jul 25 23:57 foo.jpg
$ cp foo.jpg bar.jpg
-rw-r--r--. 1 57368 Jul 29 13:37 bar.jpg
-rw-r--r--. 1 57368 Jul 25 23:57 foo.jpg
但是,使用cat将文件的内容读取到另一个文件中会调用系统调用来创建一个新文件。 这些新文件受您的默认umask设置约束。 要了解有关umask更多信息,请阅读Alex Juarez的文章,其中介绍了umask和权限。
运行umask以获取当前设置:
$
umask
0002
此设置意味着在此位置创建的新文件被授予664 ( rw-rw-r-- )权限,因为umask设置的前几位不会屏蔽任何内容(并且可执行文件位不是文件创建的默认位),并且写权限被最后一位阻止。
使用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可以类似于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
如果没有更改,则不会发生任何复制。
rsync命令具有cp中不可用的许多选项,例如设置目标权限,排除文件,删除两个目录中都没有出现的过时文件的功能,等等。 使用rsync作为cp的强大替代品,或作为有用的补充。
多种复制方式
有很多方法可以在POSIX系统上实现基本相同的结果,因此似乎可以很好地赢得开放源代码在灵活性方面的声誉。 我是否错过了复制数据的有用方法? 在评论中分享您的复制技巧。
翻译自: https://opensource.com/article/19/8/copying-files-linux