cp命令使用

发布时间:2023年12月18日

1 复制文件

cp

复制文件是计算机用户经常做的工作之一,更不用说OS了。Linux shell使用的各命令中,最棒的命令之一就是cp,它用于复制文件和目录。使用cp命令最简单的方法就是输入命令,后面再输入你想复制的文件,然后是被复制文件的新名称。可以把该命令的结构看作是“cp正在从哪复制的文件 正在复制到哪的文件”。这种关系的另一种常见表达方式是“cp 源文件目标文件”。

$ pwd
/home/scott/libby
$ ls
libby.jpg
$ cp libby.jpg libby_bak.jpg
$ ls
libby_bak.jpg libby.jpg

?

例子非常简单:将图片复制到源文件所在的相同目录中。也可以将文件复制到另一个目录中,甚至可以从非当前工作目录复制到文件系统的其他任何目录。

$ pwd
/home/scott
$ ls ~/libby
libby_bak.jpg? libby.jpg
$ cp pix/libby_arrowrock.jpg libby/arrowrock.jpg
$ ls ~/libby
arrowrock.jpg libby_bak.jpg libby.jpg

?

这个例子中使用的文件名相同(都是libby_closeup.jpg),没关系,因为是要将这个文件复制到另外一个目录中。但是,在第一个cp命令的例子中,必须使用新的文件名称,用libby_bak.jpg代替libby.jpg,因为这是在将一个文件复制到同一目录。

如果你想从其他目录复制文件到当前工作目录(你目前所在的目录),只需要使用..。(还记得在本章前面学过的.表示“当前目录”吗?现在你就明白它能在这儿派上用场了。)当然,如果使用.就不能更改文件名称,因为它只是原来文件名称的快捷方式。

$ pwd
/home/scott/libby
$ ls
libby_bak.jpg libby.jpg
$ cp pix/libby_arrowrock.jpg .
$ ls
arrowrock.jpg libby_bak.jpg libby.jpg

?

如果直接将目标文件复制到指定的目录中,则不需要指定目标文件的文件名,只需提供目录名就可以了。

$ ls -l
drwxr-xr-x?? 224 2005-10-20 12:34 libby
drwxr-xr-x?? 216 2005-09-29 23:17 music
drwxr-xr-x? 1.6K 2005-10-16 12:34 pix
$ ls libby
arrowrock.jpg? libby.jpg
$ cp pix/libby_on_couch.jpg libby
$ ls libby
arrowrock.jpg? libby.jpg? libby_on_couch.jpg

?

在上个例子中,必须确保名为libby的目录已经存在,以便能将libby_on_couch.jpg复制到其中。否则,最终将在home目录中生成一个名为libby的文件。

2 使用通配符复制文件

cp *

是时候介绍更多的偷懒办法了,也就是用通配符一次将多个文件复制到目录中。精心命名文件,将非常节约时间,因为这样你可以准确地指定一组文件。

$ pwd
/home/scott/libby
$ ls ~/pix
arrowrock.jpg? by_pool_03.jpg on_floor_03.jpg
by_pool_01.jpg on_floor_01.jpg on_floor_04.jpg
by_pool_02.jpg on_floor_02.jpg
$ ls
arrowrock.jpg libby.jpg libby_on_couch.jpg
$ cp ~/pix/by_pool*.jpg .
$ ls
arrowrock.jpg by_pool_02.jpg on_couch.jpg
by_pool_01.jpg by_pool_03.jpg libby.jpg

?

可以使用的通配符并不只限于“*”。实际上,还可以使用方括号([]),通过匹配“[”和“]”之间的任意字符来更准确地指定你想要复制哪些文件。如果你想复制前三个on_floor图片,但是不需要复制第四个,用带通配符的cp命令就能很容易地实现。

$ pwd
/home/scott/libby
$ ls ~/pix
arrowrock.jpg? by_pool_03.jpg? on_floor_03.jpg
by_pool_01.jpg on_floor_01.jpg on_floor_04.jpg
by_pool_02.jpg on_floor_02.jpg
$ ls
arrowrock.jpg? libby.jpg? libby_on_couch.jpg
$ cp ~/pix/on_floor_0[1-3].jpg .
$ ls
arrowrock.jpg? libby_on_couch.jpg? on_floor_02.jpg
libby.jpg????? on_floor_01.jpg???? on_floor_03.jpg

?

3 复制文件时显示执行过程

cp -v

增加-v选项(或--verbose),则可以在cp命令完成复制任务的同时显示其进度。

$ pwd
/home/scott/libby
$ ls ~/pix
arrowrock.jpg? by_pool_03.jpg? on_floor_03.jpg
by_pool_01.jpg on_floor_01.jpg on_floor_04.jpg
by_pool_02.jpg on_floor_02.jpg
$ ls
arrowrock.jpg? libby.jpg? libby_on_couch.jpg
$ cp -v ~/pix/on_floor_0[1-3].jpg .
'/home/scott/pix/on_floor_01.jpg'
?-> './on_floor_01.jpg'
'/home/scott/pix/on_floor_02.jpg'
?->'./on_floor_02.jpg'
'/home/scott/pix/on_floor_03.jpg'
?->'./on_floor_03.jpg'
$ ls
arrowrock.jpg? libby_on_couch.jpg? on_floor_02.jpg
libby.jpg????? on_floor_01.jpg???? on_floor_03.jpg

?

-v选项能够让你对cp命令的执行过程了如指掌。它在这方面做的非常出色,所以实际上你不需要运行最后那个ls命令,因为-v选项能够确保需要的文件事实上已经复制成功了。

4 防止复制时覆盖重要的文件

cp -i

上一个例子演示了一些有关于cp命令的重要内容,这是你需要了解的。在2.27节的例子中,将3个on_floor图片复制到libby目录中;在上一个示例中,再次将相同的3个图片再次复制到libby目录中。你要复制的目标文件早已存在了,但是cp命令不会发出警告,因为Linux是这样运行的:它假设你知道自己在做什么,所以它不会警告你将要覆盖什么文件,除非你要求它这么做。如果你需要在使用cp命令覆盖文件前得到预警,则可以使用-i选项(或--interactive)。这一次使用-i选项再试着复制相同的文件,将得到不同的结果。

$ pwd
/home/scott/libby
$ ls ~/pix
arrowrock.jpg? by_pool_03.jpg? on_floor_03.jpg
by_pool_01.jpg on_floor_01.jpg on_floor_04.jpg
by_pool_02.jpg on_floor_02.jpg$ ls
arrowrock.jpg? libby_on_couch.jpg? on_floor_02.jpg
libby.jpg????? on_floor_01.jpg???? on_floor_03.jpg
$ cp -i ~/pix/on_floor_0[1-3].jpg .
cp: overwrite './on_floor_01.jpg'?

?

砰!cp命令突然停下它的步伐,询问你是否要覆盖它准备开始复制的第一个文件libby_on_floor_01.jpg。如果你想继续并复制这个文件,输入y,否则就输入n。如果你选择输入n,并不意味着cp命令会完全停下来,相反,它会询问你下一个文件如何处置,再下一个文件,直至最后。唯一能够停止整个复制过程的方法就是按Ctrl+c取消命令的执行。同样的,也没有办法提前为所有问题选择yes,所以如果你也打算使用-i选项,将1 000个文件复制为具有相同名称的其他1 000个文件,那么你一定要确保有充足的时间可以坐在电脑前,和你的shell进行交互,因为如果你真的要覆盖文件的话,将被询问1 000次。

警告 对于普通用户来说,通常不需要使用-i选项。但是对于root用户来说,它的责任非常重要。如果root用户错误地覆盖了一个关键的系统文件,则会导致系统出现大问题。因此,在root用户的.bashrc文件中为cp命令创建一个别名是个不错的主意,用cp–i来代替cp。

? alias cp= 'cp -i'
?

5 复制目录

cp -R

到目前为止你已经学过了复制文件,但有时还需要复制目录。但是,你不能仅输入“cp 源目录 目标目录”,因为它不会如你预想的那样,虽然目录复制了,但却没有复制里面的文件。

$ pwd
/home/scott
$ cp libby libby_bak
cp: omitting directory 'libby'

?

如果想要复制目录,还需要包含-R选项(或--recursive),这个选项和ls命令的相应选项差不多,应该能够想得到。增加了-R选项意味着目录和它的内容都会被复制。

$ pwd
/home/scott
$ ls -l
drwxr-xr-x?? 328 2005-10-17 14:42 documents
drwxr-xr-x?? 240 2005-10-20 17:16 libby

$ cp -R libby libby_bak
$ ls -l
drwxr-xr-x?? 328 2005-10-17 14:42 documents
drwxr-xr-x?? 240 2005-10-20 17:16 libby
drwxr-xr-x?? 240 2005-10-20 17:17 libby_bak

?

6 复制文件到其他目录以作为完整的备份

cp -a

或许你现在正在想cp命令可以用来备份文件,确实如此。不过只要使用几行bash shell脚本,cp命令也可以作为备份各种文件和目录的有效方法。在这种情况下最有用的选项就是-a选项(或--archive),它相当于以下几个选项的组合:-dpR(或--no-dereference --preserve–recursive)。有关-a选项的另一种说法是:-a选项可以确保cp命令不会复制符号链接的内容(否则可能会极大地增加复制量),只保存关键的文件属性(例如拥有者、时间戳),并递归处理子目录。

$ pwd
/home/scott
$ ls -l
drwxr-xr-x???? 216 2005-10-21 11:31 libby
drwxr-xr-x???? 216 2005-09-29 23:17 music
$ ls -lR libby
libby:
total 312
-rw-r--r--?? 73786 2005-10-20 12:12 arrowrock.jpg
-rw-r--r--?? 18034 2005-04-19 00:57 libby.jpg
-rw-r--r--? 198557 2005-04-19 00:57 on_couch.jpg
drwxr-xr-x???? 168 2005-10-21 11:31 on_floor

libby/on_floor:
total 764
-rw-r--r--? 218849 2005-10-20 16:11 on_floor_01.jpg
-rw-r--r--? 200024 2005-10-20 16:11 on_floor_02.jpg
-rw-r--r--? 358986 2005-10-20 16:11 on_floor_03.jpg
$ cp -a libby libby_bak
$ ls -l
drwxr-xr-x??? 216 2005-10-21 11:31 libby
drwxr-xr-x??? 216 2005-10-21 11:31 libby_bak/
drwxr-xr-x??? 216 2005-09-29 23:17 music
$ ls -lR libby_bak
libby:
total 312
-rw-r--r--?? 73786 2005-10-20 12:12 arrowrock.jpg
-rw-r--r--?? 18034 2005-04-19 00:57 libby.jpg
-rw-r--r--? 198557 2005-04-19 00:57 on_couch.jpg
drwxr-xr-x???? 168 2005-10-21 11:31 on_floor

libby/on_floor:
total 764
-rw-r--r-- 218849 2005-10-20 16:11 on_floor_01.jpg
-rw-r--r-- 200024 2005-10-20 16:11 on_floor_02.jpg
-rw-r--r-- 358986 2005-10-20 16:11 on_floor_03.jpg

?

文章来源:https://blog.csdn.net/zhao_god/article/details/135061910
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。