Copy Files And Directory
文件的复制和移动对于大多数计算机爱好者来说是耳熟能详的,在window下直接鼠标右键复制粘贴,重命名等等,看着是那么简单,但是步骤也不少,但是在linux中文件的复制与移动也仅仅就是一句命令就可以实现,下面我们就来看看文件中的复制命令把..
Name:
cp(copy files and directory)复制文件和目录
命令格式:
cp [选项]... SOURCE... DESC
"..."表示源文件可以有多个因此我们可以从上面得到这样的结论:
- cp只能把一个文件复制成另一个文件
- cp可以把多个文件复制到一个目录里
3.如果cp后面有很多文件,那么最后一个一定是一个目录
下面我们通过代码详细了解一下cp的实际用法:
[[email protected] ~]$ cp /etc/man_db.conf /tmp/test [[email protected] ~]$ 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 [[email protected] ~]$
这句命令是把man_db.conf复制到/tmp/下面并且把文件改名为test
如果目标目录下存在目标文件,那么源文件的内容就会覆盖目标文件
[[email protected] tmp]$ cp /etc/man_db.conf /tmp/test [[email protected] tmp]$ cp /etc/locale.conf /tmp/test cp:是否覆盖"/tmp/test"?
这样是不是很清楚明白呢?大家注意这里cp的交互是因为在alias中定义了一个alias cp=‘cp -i‘的原因,i是cp的一个选项,实现人机交互的作用,这里的覆盖其实相当于把原来的test文件删除,然后把源文件复制到/tmp/下并且改名为test,这一点我们要理解
可是,如果test在/tmp/下是一个目呢?
[[email protected] tmp]$ cp /etc/man_db.conf /tmp/test [[email protected] tmp]$ ls /tmp/test man_db.conf [[email protected] tmp]$
这样一看就明白了,把源文件复制到test目录下,源文件的名称不变
下面我们看这样一段代码
[[email protected] tmp]$ cp /etc/init.d/ /tmp/ cp: 略过目录"/etc/init.d/" [[email protected] tmp]$
这是什么意思呢,原因很简单,cp默认机制是复制文件的,不会复制目录,可是我们想复制目录改如何实现呢?
-r:[递归选项]复制一个目录及其目录下的所有文件
[[email protected] tmp]$ cp -r /etc/init.d/ /tmp/home [[email protected] tmp]$ ls /tmp/home functions netconsole network README [[email protected] tmp]$
这样大家是不是看明白了呢? -r会把一个目录以及目录下的所有的文件递归复制出来到目标目录中,大家仔细看,/tmp下是没有home目录的,这样的执行会直接创建一个home目录并且home目录里面有源目录的内容,大家理解了吗
我们假如home是一个文件,看一看什么情况
[[email protected] tmp]$ cp -r /etc/init.d/ /tmp/1 cp: 无法以目录"/etc/init.d/" 来覆盖非目录"/tmp/1" [[email protected] tmp]$
会提示你cp: 无法以目录"/etc/init.d/" 来覆盖非目录"/tmp/1",但是在有些系统的版本中是可以执行的,执行的结果就是会覆盖文件的内容,并且创建成一个没有源文件的错误的链接,好这里大家注意一下就可以了
下面我们看一下cp的一些其它选项
-f:表示强行复制
如果目标文件存在,不进行人机交互,直接覆盖文件内容,是不是很霸道呢?
[[email protected] tmp]$ cp -f /etc/man_db.conf /tmp/1 [[email protected] tmp]$
-i:进行人际交互,前面我们讲过了
-p:保留文件的属主,属组,时间戳
[[email protected] tmp]$ cp -p ./storage.log ./storage.log1 [[email protected] tmp]$ ll -rw-r--r--. 1 root root 0 3月 9 23:36 storage.log -rw-r--r--. 1 jason jason 0 3月 9 23:36 storage.log1
-L:复制的是链接,实际上复制的是链接指向的文件(默认的是-L)
[[email protected] etc]$ ll lrwxrwxrwx. 1 root root 13 3月 10 07:19 rc.local -> rc.d/rc.local [[email protected] etc]$ cp -L /etc/rc.local /tmp/ [[email protected] etc]$ ll /tmp -rw-r--r--. 1 jason jason 473 3月 10 16:59 rc.local
看明白是什么意思了么?复制过来后显示的是一个文件,文件的内容是rc.d/rc.local的内容,而不是链接
-P:保持链接自身
[[email protected] etc]$ cp -P /etc/rc.local /tmp/rc12.local [[email protected] etc]ll /tmp lrwxrwxrwx. 1 jason jason 13 3月 10 17:04 rc12.local -> rc.d/rc.local
原来的是链接,复制过来的还是链接
-d:与-P一样,复制链接自身
-R:与-r一样,递归
-a:same as -dR,猜猜什么意思,"归档",就是不改变文件的所有属性,备份存放
好了,演示到这,cp这个命令我想你一定会是熟记于心了,在回头巩固巩固吧