每日命令 | cp

命令简介

       上回我们介绍了文件和目录的创建,今天我们来介绍一下文件和目录的复制。

1
cp——复制文件或目录

命令详解

语法

1
cp [选项] 参数1 参数2

       以上是cp命令的语法,可以看到cp命令在使用时必须提供两个参数。

参数

       参数1代表源文件,即要复制哪个文件或目录;参数2代表目标文件,即复制到哪个文件或目录。

1
cp [选项] 源文件 目标文件

       复制docker.sh,只提供一个参数,系统提示缺少一个目标文件。提供两个参数后,成功将docker.sh复制到docker1.sh。

       cp命令有三种主要的操作模式:

1
2
3
文件复制到文件
文件复制到目录
目录复制到目录

       复制docker.sh到docker1.sh就是第一种操作模式。在执行cp命令时,如果目标文件不存在,则会创建目标文件;如果目标文件已经存在,默认会用源文件覆盖目标文件。

       首先新建一个old_file文件,然后复制到new_file文件。在执行cp命令之前,new_file文件是不存在的,于是系统生成了new_file。

       这个时候,new_file文件和old_file文件都是空白文件,cat命令可用来查看文件内容,后面的文章再给大家介绍。

       然后在old_file文件中添加一句话,保存后再执行cp命令,查看new_file文件,发现new_file文件的内容已经被old_file文件所覆盖。

       以上是文件复制到文件的操作模式,接下来介绍一下文件复制到目录的操作模式。

       文件到文件和文件到目录,两种操作模式最大的区别是文件到目录的模式可以同时包含多个源文件,而文件到文件的模式只允许一个源文件,其他并没有什么区别。

       可以看到,文件复制到目录的操作模式下,系统没有报错;但文件复制到文件的操作模式,提供三个参数,系统报错,提示new_file不是目录。

       最后介绍目录复制到目录的操作模式。这种模式,可以同时复制文件和目录,但是在复制目录的时候,必须添加“-r”选项,cp命令才会将源目录复制到目标目录。

       添加“-r”选项前,系统提示没有提供“-r”选项,省略了目录的复制,只复制了docker.sh文件。

       添加“-r”选项后,成功将目录复制到了目标目录。也可以使用“-R”选项,效果和“-r”选项一样。

       需要注意的是,在文件到目录、目录到目录的操作模式中,目标文件指定的目录必须存在,cp命令并不会为我们创建目录。

选项

       cp命令选项有点多,这里我挑几个比较常用的选项给大家介绍一下,其余的大家可以查阅相关资料来进行学习。

       首先是“-i”选项。在执行cp命令时,如果目标文件存在,则默认用源文件覆盖目标文件。添加“-i”选项之后,系统会在覆盖之前询问我们。

1
cp -i 源文件 目标文件

       首先我们新建old_file文件,复制到new_file文件,然后在old_file文件中添加一句话。

       此时new_file是没有内容的,我们再执行cp命令,这个时候添加“-i”选项。

       添加“-i”选项后,系统会询问我们是否覆盖目标文件。只有我们输入“y“的时候(Y、yes、1、Yes等也可以,能代表”是“一般都行,通常都是使用y),系统才会覆盖,输入其他任何字符都会被认为不覆盖。

       添加”-i“选项后,目标文件存在时,系统都会询问我们。如果有大量的目标文件存在,那我们输入答案都要费很大功夫,特别是当我们只想复制不存在的目标文件时,这个选项显然不能很好满足我们的需求。

       为此,Linux为我们提供了”-n“选项。添加这个选项之后,系统就默认不覆盖已经存在的目标文件,可以理解为只复制不存在的目标文件。

1
cp -n 源文件 目标文件

       新建old_file和new_file文件,然后修改old_file文件,在执行cp命令时添加”-n“选项,查看new_file文件,依然是空白文件,说明没有用old_file覆盖new_file。

       除了可以选择不覆盖已经存在的目标文件,还可以选择强制复制文件,不管目标文件是否存在,这通过”-f“选项来实现。

1
cp -f 源文件 目标文件

       另外,还可以选择只有源文件的时间属性比目标文件新或目标文件不存在的时候才复制,通过”-u“选项来实现,相当于更新。

       举个例子。我在桌面上新建了一个工作周报,记录了我这周的工作内容,然后我想把这个文档复制到某个文件夹内,但这个文件夹里已经存在了上周的工作周报,这个时候我肯定要拿桌面的工作周报覆盖文件夹里的工作周报才行,反之,如果文件夹的工作周报比桌面的工作周报新,则不覆盖。”-u“选项就可以执行这个工作。

1
cp -u 源文件 目标文件

       首先将new_file文件更新,这个时候new_file文件相对old_file文件要新一些,此时添加“-u”选项复制一下,发现new_file文件内容没有改变。

       以上选项的复制都是不包含属性的,比如时间、权限等。如果想连同源文件的属性也复制过去,就必须使用“-p”选项。

1
cp -p 源文件 目标文件

       首先用stat命令查看old_file和new_file的属性,然后添加“-p”选项复制,发现new_file文件的访问时间和修改时间不是当前时间,而是old_file文件的访问时间和修改时间。

       文件权限也被复制到new_file文件。chmod命令用来修改文件和目录的权限,后面的文章会详细讲解。

知识总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
语法:
cp [选项] 源文件 目标文件
用途:复制文件或目录
选项:
-i————覆盖前的交互提示
-n————不覆盖现有文件
-f————强制复制
-u————更新
-p————保留源文件的属性
-r、-R————递归复制目录
参数:源文件、目标文件(绝对地址和相对地址都可以)
其他:
三种操作模式:文件到文件、文件到目录、目录到目录
文件到文件的操作模式,只允许有两个参数
目录到目录的操作模式,必须添加“-r”或“-R”选项
文件到目录、目录到目录的操作模式,目录必须存在

免责声明

       安全小白团是帮助用户了解信息安全技术、安全漏洞相关信息的微信公众号。安全小白团提供的程序(方法)可能带有攻击性,仅供安全研究与教学之用,用户将其信息做其他用途,由用户承担全部法律及连带责任,安全小白团不承担任何法律及连带责任。

0%