Linux常用命令(一) cp:复制

You’ve worked harder than everyone who’s ever doubted you. ——《高材生》

你要比任何曾经质疑过你的人都更努力。

语法

1
2
cp [-adfilprsu] 源文件(source) 目标文件(destination)
cp [options] source1 souce2 souce3 ... directory

选项与参数

1
2
3
4
5
6
7
8
9
-a : 相当于dpr参数组合,至于dpr请参考下列说明;(常用)
-d : 若源文件为链接文件的属性(link file),则复制链接文件属性而不是文件本身;
-f : 若目标文件已经存在,则直接覆盖且没有提示;
-i : 与-f参数相反,即如果目标文件存在,会询问用户是否覆盖;(常用)
-l : 进行硬链接(hard link)的链接文件创建,而不是复制本身;
-p : 连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性;(备份常用)
-r : 递归复制,用于目录的复制操作;(常用)
-s : 软链接(不支持目录),亦称“快捷方式”文件;
-u : 目标文件比源文件旧才可以更新,或目标文件不存在的情况下才复制;

例一:用root身份,将家目录下的.bashrc文件复制到/tmp下,并重命名为bashrc


  重复操作两次,由于/tmp已经存在bashrc了,加上-i选项后,会在覆盖前对你进行询问是否确定,可以按下n否定或者y确认。

例二:切换到/tmp,并将/var/log/wtmp复制到/tmp且观察属性。


  在不加任何选项的情况下,文件的某些属性/权限会改变。还有,就连文件创建的时间也改变了。如果你想将文件的所有特性都复制过来,可以加上-a,如下图:

  整个数据的所有特性完全一样。这就是-a的特性。

  在默认条件下,cp的源文件与目标文件的权限是不同的,目标文件的拥有者通常会是命令操作者本身。
  如例二中由于我是root用户,因此复制过来的文件拥有者与用户组就变成了root所有。
  由于这个特性,我们在备份某些需要特别注意权限的文件时,例如密码文件(/etc/shadow)以及一些配置文件,就不能直接cp来复制,而必须加上-a或者-p等可以完整复制文件权限的才行。另外,如果你要复制文件给其他用户时,也必须要注意文件的权限(包含读、写、执行以及文件的拥有者等),否则你的小伙伴还是无法使用啊!

例三:复制/etc/这个目录下的所有内容到/tmp下面。


  图片这种第二行的意思是/etc/是一个目录,你需要加上-r选项。-r是可以复制目录,但是,文件与目录的权限可能会被改变。所以,也可以使用【cp -a /etc/ /tmp】来执行,尤其是在备份的时候。


  使用-l及-s都会创建所谓的链接文件(link file),但是这两种链接文件却有不一样的情况。-l就是所谓的硬链接(hard link),而-s则是符号链接(symbolic link),即常说的软连接,简单来说bashrc_slink是一个快捷方式,这个快捷方式会链接到bashrc。所以你会看到文件右侧会有指向(->)的符号。

  至于bashrc_hlink文件与bashrc文件的属性与权限完全一模一样,与链接前的唯一差异就是第二栏的link数由1变成了2。

例五:当~/.bashrc比/tmp/bashrc新时,才复制过来。


  -u的特性是只有目标文件与源文件有差异时才复制。所以常用在备份工作中。


  在不加任何参数的时候,cp复制的是源文件,而非链接文件的属性。如果想要复制链接文件的属性,就得要使用-d的选项了,如bashrc_slink_2的创建。

例七:将家目录的.bashrc及.bash_history复制到/tmp下面。


  可以将多个文件一次复制到同一个目录中去,记住,最后一个才是目标目录。

PS: 本文参考来自-鸟哥的Linux私房菜、菜鸟教程