Linux之cp命令详解

Copy Files And Directory
文件的复制和移动对于大多数计算机爱好者来说是耳熟能详的,在windows下直接鼠标右键复制粘贴,重命名等等,看着是那么简单,但是步骤也不少,但是在Linux中文件的复制与移动也仅仅就是一句命令就可以实现,下面我们就来看看文件中的复制命令把..
    Name:
                cp(copy files and directory)复制文件和目录
    命令格式:

                cp [选项]... SOURCE... DESC

                "..."表示源文件可以有多个因此我们可以从上面得到这样的结论:
cp只能把一个文件复制成另一个文件

cp可以把多个文件复制到一个目录里

3.如果cp后面有很多文件,那么最后一个一定是一个目录

下面我们通过代码详细了解一下cp的实际用法:
[linuxidc@mylab ~]$ cp /etc/man_db.conf /tmp/test
[linuxidc@mylab ~]$ ls /tmp/
anaconda.log      storage.log
hsperfdata_root  systemd-private-3E1wlM
ifcfg.log        systemd-private-cxUWsv
ks-script-5GePg3  systemd-private-StjRUY
packaging.log    test
program.log      vmware-root
ssh-x1RDJKuGNlHn  yum.log
[linuxidc@mylab ~]$

这句命令是把man_db.conf复制到/tmp/下面并且把文件改名为test
如果目标目录下存在目标文件,那么源文件的内容就会覆盖目标文件
[linuxidc@mylab tmp]$ cp /etc/man_db.conf /tmp/test
[linuxidc@mylab tmp]$ cp /etc/locale.conf /tmp/test
cp:是否覆盖"/tmp/test"?

这样是不是很清楚明白呢?大家注意这里cp的交互是因为在alias中定义了一个alias cp='cp -i'的原因,i是cp的一个选项,实现人机交互的作用,这里的覆盖其实相当于把原来的test文件删除,然后把源文件复制到/tmp/下并且改名为test,这一点我们要理解

可是,如果test在/tmp/下是一个目呢?
[linuxidc@mylab tmp]$ cp /etc/man_db.conf /tmp/test
[linuxidc@mylab tmp]$ ls /tmp/test
man_db.conf
[linuxidc@mylab tmp]$

这样一看就明白了,把源文件复制到test目录下,源文件的名称不变
下面我们看这样一段代码
[linuxidc@mylab tmp]$ cp /etc/init.d/ /tmp/
cp: 略过目录"/etc/init.d/"
[linuxidc@mylab tmp]$

这是什么意思呢,原因很简单,cp默认机制是复制文件的,不会复制目录,可是我们想复制目录改如何实现呢?

-r:[递归选项]复制一个目录及其目录下的所有文件
[linuxidc@mylab tmp]$ cp -r /etc/init.d/ /tmp/home
[linuxidc@mylab tmp]$ ls /tmp/home
functions  netconsole  network  README
[linuxidc@mylab tmp]$

这样大家是不是看明白了呢? -r会把一个目录以及目录下的所有的文件递归复制出来到目标目录中,大家仔细看,/tmp下是没有home目录的,这样的执行会直接创建一个home目录并且home目录里面有源目录的内容,大家理解了吗
我们假如home是一个文件,看一看什么情况
[linuxidc@mylab tmp]$ cp -r /etc/init.d/ /tmp/1
cp: 无法以目录"/etc/init.d/" 来覆盖非目录"/tmp/1"
[linuxidc@mylab tmp]$

会提示你cp: 无法以目录"/etc/init.d/" 来覆盖非目录"/tmp/1",但是在有些系统的版本中是可以执行的,执行的结果就是会覆盖文件的内容,并且创建成一个没有源文件的错误的链接,好这里大家注意一下就可以了
下面我们看一下cp的一些其它选项
-f:表示强行复制
如果目标文件存在,不进行人机交互,直接覆盖文件内容,是不是很霸道呢?
[linuxidc@mylab tmp]$ cp -f /etc/man_db.conf /tmp/1
[linuxidc@mylab tmp]$

-i:进行人际交互,前面我们讲过了
-p:保留文件的属主,属组,时间戳
1234 [linuxidc@mylab tmp]$ cp -p ./storage.log ./storage.log1
[linuxidc@mylab tmp]$ ll
-rw-r--r--. 1 root  root      0 3月  9 23:36 storage.log
-rw-r--r--. 1 linuxidc jason      0 3月  9 23:36 storage.log1

-L:复制的是链接,实际上复制的是链接指向的文件(默认的是-L)
[linuxidc@mylab etc]$ ll
lrwxrwxrwx.  1 root root      13 3月  10 07:19 rc.local -> rc.d/rc.local
[linuxidc@mylab etc]$ cp -L /etc/rc.local /tmp/
[linuxidc@mylab etc]$ ll /tmp
-rw-r--r--. 1 linuxidc jason    473 3月  10 16:59 rc.local

看明白是什么意思了么?复制过来后显示的是一个文件,文件的内容是rc.d/rc.local的内容,而不是链接
-P:保持链接自身
[linuxidc@mylab etc]$ cp -P /etc/rc.local /tmp/rc12.local
[linuxidc@mylab etc]ll /tmp
lrwxrwxrwx. 1 linuxidc jason    13 3月  10 17:04 rc12.local -> rc.d/rc.local

原来的是链接,复制过来的还是链接
-d:与-P一样,复制链接自身

-R:与-r一样,递归
-a:same as -dR,猜猜什么意思j_0006.gif,"归档",就是不改变文件的所有属性,备份存放
好了,演示到这,cp这个命令我想你一定会是熟记于心了,在回头巩固巩固。

相关推荐