关于CP命令的用法细节
今天在写一个脚本时,要复制一个目录到另一个目录下时,怎么执行都不成功,后来一看原来忘记加参数啦,有时成功往往在于细节,希望大家以后一起注意吧,来让我们一起看看cp命令的用法吧
*cp(复制文件或目录)
cp [options] source destination/directory
参数:
-a:相当于-pdr的意思(常用)
--------------------------------------------------------- -d:If source has link file attribute,so copy link file attribute
,not itself
----------------------------------------------------- -f:force(强制),若目标文件已existence,and can't open,则删除后再尝试一次
-------------------------------------------------- -i:若目标文件已经存在,在覆盖时,会先询问操作的进行(常用)
------------------------------------------------------------ -l :进行硬链接(hard link)的连接文件创建,而非复制文件本身
------------------------------------------------------------ -p:连同文件的属性一起复制过去,而非使用文件的默认属性(备份常用)
----------------------------------------------------- -r:递归持续复制,用于目录的复制行为(常用)
----------------------------------------------------------
-s:复制成为符号连接文件(symbolic link)即“快捷方式”文件
----------------------------------------------------------
-u:若destination比source旧才更新
---------------------------------------------------------------
**:注意若源文件有两个以上,则最后一个目标文件一定是“目录”才行!!!
-------------------------------------------------------------
下面我们看下实例吧:
1:
[root@server53 ~]# cp ~/.bashrc /tmp/bashrc
解析:以root身份将主文件下的.bashrc 复制到/tmp目录下并且重命名为bashrc。
**也就是说cp命令还具有重命名的功能。
-------------------------------------------------------------
2:
[root@server53 tmp]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc'? <= =询问是否覆盖
解析:加上-i,它是当目标文件已存在,询问用户是否确定覆盖,确定按下y,否则n。
------------------------------------------------------------------- 3:
将目录切换到/tmp下,并将/var/log/wtmp复制到/tmp且查看属性:
[root@server53 ~]# cd /tmp
[root@server53 tmp]# cp /var/log/wtmp . # <="."代表当前目录
[root@server53 tmp]# ll /var/log/wtmp wtmp
-rw-rw-r-- 1 root utmp 342144 Jul 31 12:43 /var/log/wtmp
-rw-r--r-- 1 root root 342144 Jul 31 13:58 wtmp
解析:注意看两个文件的权限,属性,文件的创建时间都改变了。
**在不加任何参数的情况下,文件的某些属性/权限会改变,目标文件的所有者通常是命令操作者本身。
由于具有这个特性,因此当我们进行备份时,某些时候要特别注意特别权限文件,如密码文件(/etc/shadow)以及一些配置文件,就不能直接以cp来复制,而是加上-a 或者-p等可以完整复制文件权限,参数。
看如下:
[root@server53 tmp]# cp -a /var/log/wtmp wtmp_2
[root@server53 tmp]# ll /var/log/wtmp wtmp_2
-rw-rw-r-- 1 root utmp 342144 Jul 31 12:43 /var/log/wtmp
-rw-rw-r-- 1 root utmp 342144 Jul 31 12:43 wtmp_2
-----------------------------------------------------------------
4:复制/etc/这个目录下的所有内容到/tmp下面
[root@server53 tmp]# cp /etc/ /tmp
cp: omitting directory `/etc/' <==如果是目录则不能够直接复制,要加上-r的参数。
**:-r可以复制目录,但文件的权限可能会被改变,也可以用 “cp -r /etc/ /tmp”来执行,尤其是在备份时
-------------------------------------------------------------------------------
5:将1题中的bashrc创建一个连接文件
[root@server53 tmp]# ll bashrc
-rw-r--r-- 3 root root 176 Jul 31 13:53 bashrc
[root@server53 tmp]# cp -s bashrc bashrc_slink
[root@server53 tmp]# cp -l bashrc bashrc_hlink
[root@server53 tmp]# ll bashrc*
-rw-r--r-- 4 root root 176 Jul 31 13:53 bashrc
-rw-r--r-- 4 root root 176 Jul 31 13:53 bashrc_hlink
lrwxrwxrwx 1 root root 6 Jul 31 14:18 bashrc_slink -> bashrc
解析:加上-l 表示硬链接,其文件属性,权限与源文件完全相同;;加上-s 表示符号连接,其后又->,其属性权限都有所改变。
------------------------------------------------------------- 6:将bashrc_slink复制成为bashrc_slink_1与bashrc_slink_2
[root@server53 tmp]# cp -s bashrc bashrc_slink
[root@server53 tmp]# cp bashrc_slink bashrc-slink_1
[root@server53 tmp]# cp -d bashrc_slink bashrc-slink_2
[root@server53 tmp]# ll bashrc bashrc_slink bashrc-slink*
-rw-r--r-- 4 root root 176 Jul 31 13:53 bashrc
lrwxrwxrwx 1 root root 6 Jul 31 14:31 bashrc_slink -> bashrc
-rw-r--r-- 1 root root 176 Jul 31 14:32 bashrc-slink_1
lrwxrwxrwx 1 root root 6 Jul 31 14:32 bashrc-slink_2 -> bashrc解析:发现没?这个例子很有趣,原本复制的是连接文件,但是却将连接文件的实际文件复制过来了
也就是说不加任何参数cp复制的是源文件,而非连接文件的属性;
若要复制连接文件的属性,就要加上-d参数。
---------------------------------------------------------
用cp命令时注意:::
First: 是否要完整保留源文件的信息
Second:源文件是否是为软连接文件
Thirst: 源文件是否为目录
参考书系:鸟哥的私房菜
希望大家好好分享!!!