命令介绍

cp 命令,主要用来复制文件和目录,同时借助某些选项,还可以实现复制整个目录,以及比对两文件的新旧而予以升级等功能。

命令格式

cp 命令的基本格式为: cp [选项] 源文件 目标文件

注意:
源文件可以有多个,但这种情况下,目标文件必须是目录才可以。

常用选项参见表:

选项 作用 备注
-a 相当于 -d、-p、-r 选项的集合,这几个选项我们一一介绍; -
-d 如果源文件为软链接(对硬链接无效),则复制出的目标文件也为软链接; -
-i 询问,如果目标文件已经存在,则会询问是否覆盖; -
-l 把目标文件建立为源文件的硬链接文件,而不是复制源文件; -
-s 把目标文件建立为源文件的软链接文件,而不是复制源文件; -
-p 复制后目标文件保留源文件的属性(包括所有者、所属组、权限和时间); -
-r 递归复制,用于复制目录; -
-u 若目标文件比源文件有差异,则使用该选项可以更新目标文件,此选项可用于对文件的升级和备用。 -

命令实例

实例一:常规复制

将当前目录下的 file1 文件复制到 /tmp 目录下:

1
2
3
[root@ubuntu2204-101 ~ 08:32:48]# cp file1 /tmp/
[root@ubuntu2204-101 ~ 08:41:08]# ls /tmp/file1
/tmp/file1

实例二:复制重命名

将当前目录下的 file1 文件复制到 /tmp 目录下并重命名为 rename_file1:

1
2
3
[root@ubuntu2204-101 ~ 08:41:11]# cp file1 /tmp/rename_file1
[root@ubuntu2204-101 ~ 08:42:15]# ls /tmp/rename_file1
/tmp/rename_file1

实例三:交互复制

参数: -i,这种情况下的复制是目标路径已经存在了和源文件同名的文件:

1
2
[root@ubuntu2204-101 ~ 08:43:16]# cp -i file1 /tmp/
cp: overwrite '/tmp/file1'? y

实例四:将多个文件复制到指定路径

参数: -r,递归复制,一般用对目录进行复制

1
2
3
4
5
[root@ubuntu2204-101 ~ 08:43:59]# ls
CentOS-7-x86_64-Minimal-2009.iso data.zip.gz etc file1 snap test2 user.zip.gz

# 将当前目录下的 file1 data.zip.gz etc/ user.zip.gz 文件或目录复制到 /tmp/ 目录下:
[root@ubuntu2204-101 ~ 08:45:23]# cp -r file1 data.zip.gz etc/ user.zip.gz /tmp/

实例五:复制软链接文件

我们先在系统里面找一个软链接文件,比如:

1
2
[root@ubuntu2204-101 ~ 08:49:11]# ls /usr/bin/pager -al
lrwxrwxrwx 1 root root 23 Apr 21 08:57 /usr/bin/pager -> /etc/alternatives/pager

不加参数: -d,复制的是源文件,而不是软链接文件,即:复制的是 /etc/alternatives/pager

1
2
3
4
5
[root@ubuntu2204-101 ~ 08:49:21]# cp /usr/bin/pager /tmp/

# 查看:
[root@ubuntu2204-101 ~ 08:49:51]# ls -al /tmp/pager
-rwxr-xr-x 1 root root 199048 Sep 6 08:49 /tmp/pager

加:参数: -d,复制的是软链接文件,而不是源文件,即:复制的是 /usr/bin/pager

1
2
3
4
5
[root@ubuntu2204-101 ~ 08:51:08]# cp -d /usr/bin/pager /tmp/

# 查看:
[root@ubuntu2204-101 ~ 08:53:04]# ls -al /tmp/pager
lrwxrwxrwx 1 root root 23 Sep 6 08:53 /tmp/pager -> /etc/alternatives/pager

注意:
“-d” 选项对硬链接是无效的。

实例六:复制时保存文件的原属性

先来看下同文件在经过复制后的属性变化:

1
2
3
4
5
6
7
# 源文件:属主是 ubuntu ,mtime 是 Sep  6 08:27
[root@ubuntu2204-101 ~ 08:55:33]# ll file1
-rw-r--r-- 1 ubuntu root 4 Sep 6 08:27 file1

# 目标文件:属主是 root ,mtime 是 Sep 6 08:46
[root@ubuntu2204-101 ~ 08:56:06]# ll /tmp/file1
-rw-r--r-- 1 root root 4 Sep 6 08:46 /tmp/file1

而当我们执行备份、曰志备份的时候,这些文件的时间可能是一个重要的参数,这就需参数: -p选项了。这个选项会保留源文件的属性,包括所有者、所属组和时间。例如:

1
2
3
4
[root@ubuntu2204-101 ~ 08:56:11]# cp -p file1 /tmp/

[root@ubuntu2204-101 ~ 08:59:01]# ls -al /tmp/file1
-rw-r--r-- 1 ubuntu root 4 Sep 6 08:27 /tmp/file1

我们之前讲过,”-a” 选项相当于 “-d、-p、-r” 选项,这几个选项我们已经分别讲过了。所以,当我们使用 “-a” 选项时,目标文件和源文件的所有属性都一致,包括源文件的所有者,所属组、时间和软链接性。使用 “-a” 选项来取代 “-d、-p、-r” 选项更加方便。

###实例七:目标文件会被建立为源文件的硬链接

参数: -l,目标文件会被建立为源文件的硬链接

1
2
3
4
[root@ubuntu2204-101 ~ 09:03:54]# cp -l file1 test2/

[root@ubuntu2204-101 ~ 09:04:09]# ls -al test2/file1
-rw-r--r-- 2 ubuntu root 4 Sep 6 08:27 test2/file1

实例八:目标文件会被建立为源文件的软链接。

参数: -s,目标文件会被建立为源文件的软链接。

1
2
3
4
[root@ubuntu2204-101 ~ 09:06:25]# cp -s /root/file1 /root/test2/file

[root@ubuntu2204-101 ~ 09:06:44]# ls -al /root/test2/file
lrwxrwxrwx 1 root root 11 Sep 6 09:06 /root/test2/file -> /root/file1

注意:软链接一定要写源文件和目标文件的绝对路径。同时,这两个选项 “-l” 、”-s” 和 “-d” 选项是不同的,”d” 选项要求源文件必须是软链接,目标文件才会复制为软链接;而 “-l” 和 “-s” 选项的源文件只需是普通文件,目标文件就可以直接复制为硬链接和软链接