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.复制单个文件到目标目录,文件在目标目录中不存在。
[[email protected] ~]# cp a.txt backup/ [[email protected] ~]# ll a.txt -rw-r--r--. 1 root root 4 Jun 30 14:56 a.txt [[email protected] ~]# ll backup/ total 4 -rw-r--r--. 1 root root 4 Jul 4 22:07 a.txt [[email protected] ~]#
说明:会发现两个文件的时间戳是不一样的,如果想要目标文件和源文件属性一样,可以使用-a选项
2.复制单个文件到目标目录,文件在目标目录中已存在,复制后的文件与源文件属性一样。
[[email protected] ~]# ll a.txt -rw-r--r--. 1 root root 4 Jun 30 14:56 a.txt [[email protected] ~]# cp -a a.txt backup/ cp: overwrite `backup/a.txt‘? y [[email protected] ~]# ll backup/ total 4 -rw-r--r--. 1 root root 4 Jun 30 14:56 a.txt [[email protected] ~]#
说明:cp在复制文件时,如果目标目录的文件是已存在的,会提示是否覆盖文件,这是由于命令行下的cp是有别名的,使用alias | grep "cp"查看cp别名,alias cp=‘cp -i‘,-i参数是若目标文件已经存在,在覆盖时会先询问;如果不想提示询问直接覆盖,可以cp -n 或者/bin/cp。
3.复制目录:
目标目录不存在时
[[email protected] ~]# 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 [[email protected] ~]# cp -a mkdirtest mkdirtest2 [[email protected] ~]# 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 [[email protected] ~]# 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
目标目录已存在时
[[email protected] ~]# mkdir mkdirtest3 [[email protected] ~]# ll mkdirtest3 total 0 [[email protected] ~]# cp -a mkdirtest mkdirtest3 [[email protected] ~]# ll mkdirtest3 total 4 drwxr-xr-x. 8 root root 4096 Jun 29 02:38 mkdirtest [[email protected] ~]#
说明:在复制目录时,当目标目录不存在时,复制时会先创建目标目录,然后将源目录内的内容复制到目标目录;当目标目录存在时,会直接将源目录复制到已存在的目标目录下。