2

2.13Linux下cp命令及其参数详解

Posted by 撒得一地 on 2015年10月25日 in Linux教程

在linux下,要复制文件或目录,使用cp(copy)命令即可。不过cp命令不仅可以用来复制文件,还可以创建快捷方式,对比新旧文等。下面先来看下cp命令的用法。

cp命令用法

[root@lmode ~]# cp [-adfilprsu] 复制源 目标源

[root@lmode ~]# cp [options] source1 source2 ... 目录

其实命令的用法很简单,就是将复制源(source,就是你要复制的文件或目录)复制到相应的目标源(destination,就是文件最终被复制到的目录)。

cp选项和参数

选项与参数:
-a  :相当于 -pdr 的意思,pdr相应含义看下面

-d  :若来源为连结档的属性(link file),则复制连结档属性而原非文件本身;

-f  :为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;

-i  :若目标档(destination)已经存在时,在覆盖时会先询问是否进行覆盖(常用)

-l  :进行硬式连结(hard link)的连结档创建,而非复制文件本身;

-p  :连同文件的属性一起复制过去,而非使用默认属性(备份常用);

-r  :递回持续复制,用于目录的复制行为;(常用)

-s  :复制成为符号连结档 (symbolic link),也就是捷径文件的意思;

-u  :若 destination 比 source 旧才升级 destination !

最后需要注意的,如果来源文件有两个以上,则最后一个目的档一定要是目录才行。

复制(cp)这个命令是非常重要的,不同身份者运行这个命令会有不同的结果产生,尤其是那个-a, -p的选项,对于不同身份来说,差异则非常的大。

实例1:
用root身份,将家目录下的.bashrc 复制到 /tmp 下,并更名为bashrc。

[root@lmode ~]# cp ./.bashrc /tmp/bashrc

[root@lmode ~]# cp -i ./.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc'? n  <==n不覆盖,y为覆盖

# 重复作两次动作,由于第一次复制/tmp底下已经存在 bashrc了,加上 -i 选项后,
# 则在覆盖前会询问是否对原来的内容进行覆盖提示。可以按下 n(no,不覆盖)或者y(yes,同意覆盖)来进行二次确认。

实例2:
切换目录到/tmp,并将/var/log/wtmp复制到/tmp下并观察属性:

[root@lmode ~]# cd /tmp

[root@lmode tmp]# cp /var/log/wtmp . <==.表示复制到当前目录

[root@lmode tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-r--r-- 1 root root 96384 Sep 24 14:06 wtmp

在不加任何选项的情况下,复制文件的某些属性/权限发生改变,上面文件的创建时间也发生了变化

实例3:
在复制过程中如果想要将文件的所有特性都一起复制过来要怎么做?可以加上-a参数。

[root@lmode tmp]# cp -a /var/log/wtmp wtmp_2

[root@lmode tmp]# ls -l /var/log/wtmp wtmp_2
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 wtmp_2 

在cp复制的过程中,复制完成后,复制文件的拥有者与群组就变成操作者本身。所以一般来说,cp的来源文件与最终复制后的文件权限可能不同。所以,基于这个特性,当我们在进行备份的时候,某些需要特别注意的特殊权限文件,例如密码文件(/etc/shadow)以及一些配置文件,就不能直接以cp来复制,而必须要加上 -a 或者是 -p 等等可以完整复制文件权限的选项。另外,如果你想要复制文件给其他的使用者,也必须要注意到文件的权限(包含读、写、运行以及文件拥有者等)。

实例4:
复制 /etc/ 这个目录下的所有内容到 /tmp 底下。

[root@lmode tmp]# cp /etc/ /tmp

cp: omitting directory `/etc'   <== 如果是目录则不能直接复制,要加上-r的选项

[root@lmode tmp]# cp -r /etc/ /tmp

# -r 是可以复制目录,但是,文件与目录的权限可能会被改变
# 所以,也可以利用cp -a /etc /tmp 来下达命令。尤其是在备份的情况下。

实例5:
将家目录的 .bashrc 及 .bash_history 复制到 /tmp 底下。

[root@lmode tmp]# cp ~/.bashrc ~/.bash_history /tmp

# 可以将多个数据一次复制到同一个目录去。最后面一定是目录。

实例6:
普通用户很难将一些高权限用户的文件属性完整复制过来。
比如否使用普通用户,完整的复制/var/log/wtmp文件到/tmp底下?

[ppp@www ~]$ cp -a /var/log/wtmp /tmp/ppp_wtmp

[ppp@www ~]$ ls -l /var/log/wtmp /tmp/ppp_wtmp
-rw-rw-r-- 1 vbird vbird 96384  9月 24 11:54 /tmp/ppp_wtmp
-rw-rw-r-- 1 root  utmp  96384  9月 24 11:54 /var/log/wtmp

由于普通用户的身份并不能随意修改文件的拥有者与群组,因此虽然能够复制wtmp的相关权限与时间等属性,但是与拥有者、群组相关的,即使加上 -a 选项,普通用户也是无法达成完整复制权限的!

标签:, ,

上一篇:

下一篇:

相关推荐

2 Comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注

6 + 5 = ?

网站地图|XML地图

Copyright © 2015-2018 技术拉近你我! All rights reserved.
闽ICP备15015576号-1,版权所有©psz.