cp(Copy file)命令用来复制文件或者目录,是Linux系统中最常用的命令之一。一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数。但是如果是在shell脚本中执行cp时,没有-i参数时不会询问是否覆盖。
1.命令格式:
cp [OPTION]… SOURCE… DIRECTORY
2.命令功能:
将源文件复制至目标文件,或将多个源文件复制至目标目录。
3.命令参数:
-a, –archive 等于-dR –preserve=all 此参数的效果和同时指定"-dpR"参数相同;
-f, –force 如果目标文件无法打开则将其移除并重试(当 -n 选项存在时则不需再选此项)
-i, –interactive 覆盖前询问(使前面的 -n 选项失效)
-d 当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录;
-p 等于–preserve=模式,所有权,时间戳
–preserve[=属性列表 保持指定的属性(默认:模式,所有权,时间戳),如果可能保持附加属性:环境、链接、xattr 等
-R, -r, –recursive 复制目录及目录内的所有项目
-v, –verbose 显示详细的复制过程
4. 常用范例:
创造前提条件:
[root@localhost ~]#ls [root@localhost ~]#mkdir source [root@localhost ~]#mkdir target [root@localhost ~]#ls source target [root@localhost ~]#cp /etc/l*.conf source/ [root@localhost ~]#ll source/ total 32 -rw-r--r-- 1 root root 1662 Mar 17 00:09 latrace.conf -rw-r--r-- 1 root root 28 Mar 17 00:09 ld.so.conf -rw-r----- 1 root root 191 Mar 17 00:09 libaudit.conf -rw-r--r-- 1 root root 2293 Mar 17 00:09 libuser.conf -rw-r--r-- 1 root root 662 Mar 17 00:09 logrotate.conf -rw-r--r-- 1 root root 10814 Mar 17 00:09 ltrace.conf
例1:复制单个文件,文件在目标目录中不存在
[root@localhost ~]#cp source/latrace.conf target #最正常的情况 [root@localhost ~]#ll target/ total 4 -rw-r--r-- 1 root root 1662 Mar 17 00:11 latrace.conf [root@localhost ~]#cp source/ld.so.conf target/ld.so.conf.bak #当目标目录存在,目标文件不存在,复制的文件名可以和原始的不同,相当于复制带重命名。 [root@localhost ~]#ll target/ total 8 -rw-r--r-- 1 root root 1662 Mar 17 00:11 latrace.conf -rw-r--r-- 1 root root 28 Mar 17 00:13 ld.so.conf.bak [root@localhost ~]#cp source/libaudit.conf dir/lib #复制的目标目录必须存在,不然报错 cp: cannot create regular file `dir/lib': No such file or directory
例2:复制单个文件,文件在目标目录存在
[root@localhost ~]#ll source/ total 32 -rw-r--r-- 1 root root 1662 Mar 17 00:09 latrace.conf -rw-r--r-- 1 root root 28 Mar 17 00:09 ld.so.conf -rw-r----- 1 root root 191 Mar 17 00:09 libaudit.conf -rw-r--r-- 1 root root 2293 Mar 17 00:09 libuser.conf -rw-r--r-- 1 root root 662 Mar 17 00:09 logrotate.conf -rw-r--r-- 1 root root 10814 Mar 17 00:09 ltrace.conf [root@localhost ~]#ll target/ total 8 -rw-r--r-- 1 root root 1662 Mar 17 00:11 latrace.conf -rw-r--r-- 1 root root 28 Mar 17 00:13 ld.so.conf.bak [root@localhost ~]#cp source/ld.so.conf target/latrace.conf #当指定的目标文件名与目标目录中已有文件同名的时候,会把源文件重命名为目标文件名, #并覆盖目标目录下的文件 cp: overwrite `target/latrace.conf'? y [root@localhost ~]#ll target/ total 8 -rw-r--r-- 1 root root 28 Mar 17 00:18 latrace.conf #文件大小变了 -rw-r--r-- 1 root root 28 Mar 17 00:13 ld.so.conf.bak [root@localhost ~]#cp source/latrace.conf target #和上面的一样,没有指定目标文件名,则复制过来保持源文件名,如果目标目录已有,覆盖 cp: overwrite `target/latrace.conf'? y [root@localhost ~]#ll target/ total 8 -rw-r--r-- 1 root root 1662 Mar 17 00:20 latrace.conf #文件大小变了 -rw-r--r-- 1 root root 28 Mar 17 00:13 ld.so.conf.bak
例3:复制单个文件,目标文件存在且为目录
[root@localhost ~]#cd target/ [root@localhost ~/target]#rm -rf * [root@localhost ~/target]#mkdir ld.so.conf #创建同名目录 [root@localhost ~/target]#ll total 4 drwxr-xr-x 2 root root 4096 Mar 17 00:28 ld.so.conf [root@localhost ~/target]#cd .. [root@localhost ~]#cp source/ld.so.conf target #目标文件名和目录名同名,不成功 cp: overwrite `target/ld.so.conf'? y cp: cannot overwrite directory `target/ld.so.conf' with non-directory [root@localhost ~]#cp source/ld.so.conf target/ld.so.conf #相当于复制到了一个目录里面了 [root@localhost ~]#ll target/ld.so.conf/ld.so.conf -rw-r--r-- 1 root root 28 Mar 17 00:29 target/ld.so.conf/ld.so.conf
例4:多文件复制,目标目录不存在
[root@localhost ~]#cd target/ [root@localhost ~/target]#rm -rf * [root@localhost ~/target]#ls [root@localhost ~/target]#cd .. [root@localhost ~]#cp source/* target/file1 #复制错误,目标必须要为目录才可以 cp: target `target/file1' is not a directory [root@localhost ~]#cp source/* target #target是个目录,能够成功复制 [root@localhost ~]#ll target/ total 32 -rw-r--r-- 1 root root 1662 Mar 17 00:34 latrace.conf -rw-r--r-- 1 root root 28 Mar 17 00:34 ld.so.conf -rw-r----- 1 root root 191 Mar 17 00:34 libaudit.conf -rw-r--r-- 1 root root 2293 Mar 17 00:34 libuser.conf -rw-r--r-- 1 root root 662 Mar 17 00:34 logrotate.conf -rw-r--r-- 1 root root 10814 Mar 17 00:34 ltrace.conf
多文件复制,目标目录必须存在才可以
例5:多文件复制,目标文件存在为目录,可以正常复制
[root@localhost ~]#cd target/ [root@localhost ~/target]#rm -rf * [root@localhost ~/target]#cd .. [root@localhost ~]#cp source/latrace.conf source/ld.so.conf target/ #将两个文件复制到最后的目录中 [root@localhost ~]#ll target/ total 8 -rw-r--r-- 1 root root 1662 Mar 17 00:39 latrace.conf -rw-r--r-- 1 root root 28 Mar 17 00:39 ld.so.conf
例6:目录复制,必须使用-r选项,递归复制,当目标文件不存在时(目标文件的上一级目录必须存在)
root@localhost ~]#cd target/ [root@localhost ~/target]#rm -rf * [root@localhost ~/target]#cd .. [root@localhost ~]#cp source target #目录:source 多个文件:source/* cp: omitting directory `source' [root@localhost ~]#cp -r source target #相当于单个文件复制到一个目录下面,同样的道理,相当于:cp -r source target/source [root@localhost ~]#ll target/ total 4 drwxr-xr-x 2 root root 4096 Mar 17 00:41 source [root@localhost ~]#ll target/source/ total 32 -rw-r--r-- 1 root root 1662 Mar 17 00:41 latrace.conf -rw-r--r-- 1 root root 28 Mar 17 00:41 ld.so.conf -rw-r----- 1 root root 191 Mar 17 00:41 libaudit.conf -rw-r--r-- 1 root root 2293 Mar 17 00:41 libuser.conf -rw-r--r-- 1 root root 662 Mar 17 00:41 logrotate.conf -rw-r--r-- 1 root root 10814 Mar 17 00:41 ltrace.conf [root@localhost ~]#cd target/ [root@localhost ~/target]#rm -rf * [root@localhost ~/target]#cd .. [root@localhost ~]#cp -r source/ target/file #复制并将目录重命名 [root@localhost ~]#ll target/ total 4 drwxr-xr-x 2 root root 4096 Mar 17 00:44 file [root@localhost ~]#ll target/file/ total 32 -rw-r--r-- 1 root root 1662 Mar 17 00:44 latrace.conf -rw-r--r-- 1 root root 28 Mar 17 00:44 ld.so.conf -rw-r----- 1 root root 191 Mar 17 00:44 libaudit.conf -rw-r--r-- 1 root root 2293 Mar 17 00:44 libuser.conf -rw-r--r-- 1 root root 662 Mar 17 00:44 logrotate.conf -rw-r--r-- 1 root root 10814 Mar 17 00:44 ltrace.conf
例7:目录复制,必须使用-r选项,递归复制,当目标存在且为文件时,复制错误,目标必须是目录
例8:目录复制,必须使用-r选项,递归复制,当目标存在且为目录时,可以复制,复制原目录及下面的所有内容到目标目录下面
例9:-a 复制的时候保留所有的属性,一般用在备份上面
[root@localhost ~]#cd target/ [root@localhost ~/target]#rm -rf * [root@localhost ~/target]#cd .. [root@localhost ~]#cd source/ [root@localhost ~/source]#ll total 32 -rw-r--r-- 1 root root 1662 Mar 17 00:09 latrace.conf -rw-r--r-- 1 root root 28 Mar 17 00:09 ld.so.conf -rw-r----- 1 root root 191 Mar 17 00:09 libaudit.conf -rw-r--r-- 1 root root 2293 Mar 17 00:09 libuser.conf -rw-r--r-- 1 root root 662 Mar 17 00:09 logrotate.conf -rw-r--r-- 1 root root 10814 Mar 17 00:09 ltrace.conf [root@localhost ~/source]#chown zhao.zhao latrace.conf [root@localhost ~/source]#ll #注意时间和属主 total 32 -rw-r--r-- 1 zhao zhao 1662 Mar 17 00:09 latrace.conf -rw-r--r-- 1 root root 28 Mar 17 00:09 ld.so.conf -rw-r----- 1 root root 191 Mar 17 00:09 libaudit.conf -rw-r--r-- 1 root root 2293 Mar 17 00:09 libuser.conf -rw-r--r-- 1 root root 662 Mar 17 00:09 logrotate.conf -rw-r--r-- 1 root root 10814 Mar 17 00:09 ltrace.conf [root@localhost ~/source]#cd .. [root@localhost ~]#cp -ra source target/ [root@localhost ~]#cd target/ [root@localhost ~/target]#ll total 4 drwxr-xr-x 2 root root 4096 Mar 17 00:09 source #注意时间不变 [root@localhost ~/target]#ll source/ #属性不变 total 32 -rw-r--r-- 1 zhao zhao 1662 Mar 17 00:09 latrace.conf -rw-r--r-- 1 root root 28 Mar 17 00:09 ld.so.conf -rw-r----- 1 root root 191 Mar 17 00:09 libaudit.conf -rw-r--r-- 1 root root 2293 Mar 17 00:09 libuser.conf -rw-r--r-- 1 root root 662 Mar 17 00:09 logrotate.conf -rw-r--r-- 1 root root 10814 Mar 17 00:09 ltrace.conf
10: -a等同于–preserve=all
cp --preserve=timestamps file file1 # 保留时间戳 cp --preserve=mode file file1 # 保留模式 cp --preserve=ownership file file1 # 保留所有权 cp -p file file1 # 包括上述三者
11:shell里面的cp命令也是一个别名,交互式的cp命令,如果想在脚本中使-f生效,要使用原始的命令
[root@localhost ~]#cp -rf source/ target/ #当交互选项和强制选项在一起的时候,强制选项不生效, cp: overwrite `target/source/logrotate.conf'? y cp: overwrite `target/source/ld.so.conf'? y cp: overwrite `target/source/libuser.conf'? y cp: overwrite `target/source/ltrace.conf'? y cp: overwrite `target/source/libaudit.conf'? y cp: overwrite `target/source/latrace.conf'? y [root@localhost ~]#\cp -rf source/ target/ #使用原始命令就可以
12:如果要复制软连接指向的文件怎么办
–
–
–
评论前必须登录!
注册