复制文件
cp
复制文件是计算机用户经常做的工作之一,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的文件。
使用通配符复制文件
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
复制文件时显示执行过程
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命令的执行过程了如指掌。-v选项能够确保需要的文件事实上已经复制成功了。
防止复制时覆盖重要的文件
cp -i
因为Linux是这样运行的:它假设你知道自己在做什么,所以它不会警告你将要覆盖什么文件,除非你要求它这么做。如果你需要在使用cp命令覆盖文件前得到预警,则可以使用-i选项(或–interactive)。
$ 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'
复制目录
cp -R
有时需要复制目录。但是,你不能仅输入“cp 源目录 目标目录”,因为它不会如你预想的那样,虽然目录复制了,但却没有复制里面的文件。
如果想要复制目录,还需要包含-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
复制文件到其他目录以作为完整的备份
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