路漫漫其修远兮
吾将上下而求索

linux文件复制:cp命令

        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选项,递归复制,当目标存在且为目录时,可以复制,复制原目录及下面的所有内容到目标目录下面

853909-20160810103929387-1800362484.png

例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:如果要复制软连接指向的文件怎么办

未经允许不得转载:江哥架构师笔记 » linux文件复制:cp命令

分享到:更多 ()

评论 抢沙发

评论前必须登录!