cp命令用于文件及目录的复制,是linux常用的命令之一,一般情况下,shell会设置一个别名alias cp='cp -i',在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数。但是如果是在shell脚本中执行cp时,没有-i参数时不会询问是否覆盖。这说明命令行和shell脚本的执行方式有些不同。 

1.命令格式:    

cp [OPTION]... [-T] SOURCE DEST

cp [OPTION]... SOURCE... DIRECTORY

cp [OPTION]... -t DIRECTORY SOURCE...


2.命令参数:

cp [-aifpru] [源文件][目标文件]

-a:相当于-pdr

-d:若源文件为链接文件(like file),则复制链接文件属性而非档案本身

-f:强制,若目标档案已经存在且无法开启,则移除后在尝试

-i:若目标文件已经存在,在覆盖时会先询问;

-p:连同档案的属性一起复制过来,而非使用默认属性

-r:递归,用于复制目录

-u:若目标文件存在。则目标文件比源文件旧时才复制;

3.命令实例:

  1.复制单个文件到目标目录,文件在目标目录中不存在。

[root@oldboylinux ~]# cp a.txt backup/
[root@oldboylinux ~]# ll a.txt 
-rw-r--r--. 1 root root 4 Jun 30 14:56 a.txt
[root@oldboylinux ~]# ll backup/
total 4
-rw-r--r--. 1 root root 4 Jul  4 22:07 a.txt
[root@oldboylinux ~]#

说明:会发现两个文件的时间戳是不一样的,如果想要目标文件和源文件属性一样,可以使用-a选项

 2.复制单个文件到目标目录,文件在目标目录中已存在,复制后的文件与源文件属性一样。

[root@oldboylinux ~]# ll a.txt 
-rw-r--r--. 1 root root 4 Jun 30 14:56 a.txt
[root@oldboylinux ~]# cp -a a.txt backup/
cp: overwrite `backup/a.txt'? y
[root@oldboylinux ~]# ll backup/
total 4
-rw-r--r--. 1 root root 4 Jun 30 14:56 a.txt
[root@oldboylinux ~]#

说明:cp在复制文件时,如果目标目录的文件是已存在的,会提示是否覆盖文件,这是由于命令行下的cp是有别名的,使用alias | grep "cp"查看cp别名,alias cp='cp -i',-i参数是若目标文件已经存在,在覆盖时会先询问;如果不想提示询问直接覆盖,可以cp -n 或者/bin/cp。

 3.复制目录:

   目标目录不存在时

[root@oldboylinux ~]# ls
anaconda-ks.cfg  a.txt  backup  b.txt  c.txt  data  d.txt  ett.txt  e.txt  install.log  install.log.syslog  mkdirtest  oldboy.txt  readme.txt  test
[root@oldboylinux ~]# cp -a mkdirtest mkdirtest2
[root@oldboylinux ~]# ll mkdirtest2
total 24
drwxr-xr-x. 2 root root 4096 Jun 29 02:38 bin
drwxr-xr-x. 4 root root 4096 Jun 29 02:38 config
drwxr-xr-x. 4 root root 4096 Jun 29 02:38 info
drwxr-xr-x. 2 root root 4096 Jun 29 02:38 lib
drwxr-xr-x. 2 root root 4096 Jun 29 02:38 lib32
drwxr-xr-x. 2 root root 4096 Jun 29 02:38 sbin
[root@oldboylinux ~]# ll mkdirtest
total 24
drwxr-xr-x. 2 root root 4096 Jun 29 02:38 bin
drwxr-xr-x. 4 root root 4096 Jun 29 02:38 config
drwxr-xr-x. 4 root root 4096 Jun 29 02:38 info
drwxr-xr-x. 2 root root 4096 Jun 29 02:38 lib
drwxr-xr-x. 2 root root 4096 Jun 29 02:38 lib32
drwxr-xr-x. 2 root root 4096 Jun 29 02:38 sbin

  目标目录已存在时

[root@oldboylinux ~]# mkdir mkdirtest3
[root@oldboylinux ~]# ll mkdirtest3
total 0
[root@oldboylinux ~]# cp -a mkdirtest mkdirtest3
[root@oldboylinux ~]# ll mkdirtest3
total 4
drwxr-xr-x. 8 root root 4096 Jun 29 02:38 mkdirtest
[root@oldboylinux ~]#

说明:在复制目录时,当目标目录不存在时,复制时会先创建目标目录,然后将源目录内的内容复制到目标目录;当目标目录存在时,会直接将源目录复制到已存在的目标目录下。