简述
cp 命令用来复制文件或目录。当复制多个文件时,目标文件参数必须为已经存在的目录。cp 命令默认不能复制目录,复制目录必须使用 -R 选项。
命令介绍
命令名称
cp命令全称
copy基本语法
cp [选项]… [-T] 源文件 目标文件
或:cp [选项]… 源文件… 目录
或:cp [选项]… -t 目录 源文件…功能描述
将源文件复制至目标文件,或将多个源文件复制至目标目录。
命令选项
选项 | 说明 |
---|---|
-a, --archive |
等于-dR --preserve=all
|
--backup[=CONTROL] |
为每个已存在的目标文件创建备份 |
-b |
类似 --backup ,但不接受参数 |
-d |
等于--no-dereference --preserve=links
|
-f, --force |
强行复制文件或目录,不论目标文件或目录是否已存在。 |
-i, --interactive |
覆盖既有文件之前先询问用户 |
-l, --link |
对源文件建立硬连接,而非复制文件。 |
-n, --no-clobber |
不要覆盖已存在的文件(使前面的 -i 选项失效) |
-P, --no-dereference |
不跟随源文件中的符号链接 |
-p, --preserve |
保留源文件或目录的属性(默认:模式、所有权、时间戳) |
-R, -r, --recursive |
递归复制目录及其子目录内的所有内容 |
-s, --symbolic-link |
只创建符号链接而不复制文件 |
-S, --suffix=SUFFIX |
自行指定备份文件的后缀 |
-t, --target-directory=DIRECTORY |
将所有参数指定的源文件/目录复制至目标目录 |
-T, --no-target-directory |
将目标目录视作普通文件 |
-u, --update |
当目标文件不存在,或者源文件比目标文件新时,才执行复制操作。 |
-v, --verbose |
显示详细的进行步骤 |
--help |
在标准输出上显示帮助信息并退出 |
--version |
在标准输出上显示版本信息并退出 |
使用范例
1.不带任何参数下,运行 cp
这是 cp 命令最基础的使用,将文件从一个位置到另一个位置。
[wang@localhost c++]$ ls *.c
hello.c
[wang@localhost c++]$ ls /home/wang/script/
[wang@localhost c++]$ cp hello.c /home/wang/script/
[wang@localhost c++]$ ls *.c
hello.c
[wang@localhost c++]$ ls /home/wang/script/
hello.c
注意:和 mv 命令不同的是:cp 拷贝后,原文件依然存在。
2.同时拷贝多个文件
要同时拷贝多个文件,只需要将多个文件用空格隔开。
[wang@localhost c++]$ ls /home/wang/script/
hello.c
[wang@localhost c++]$ cp qt5_cadaques.pdf qwt.pdf /home/wang/script/
[wang@localhost c++]$ ls /home/wang/script/
hello.c qt5_cadaques.pdf qwt.pdf
3.拷贝一个目录
要拷贝一个目录,需要添加 -r
或者 -R
选项来递归实现。
[wang@localhost doc]$ tree linux/
linux/
└── linux-program.pdf
0 directories, 1 file
[wang@localhost doc]$ tree /home/wang/script/
/home/wang/script/
├── hello.c
├── qt5_cadaques.pdf
└── qwt.pdf
0 directories, 3 files
[wang@localhost doc]$ cp -r linux/ /home/wang/script/
[wang@localhost doc]$ tree /home/wang/script/
/home/wang/script/
├── hello.c
├── linux
│ └── linux-program.pdf
├── qt5_cadaques.pdf
└── qwt.pdf
1 directory, 4 files
4.创建文件的硬链接,而不是拷贝
拷贝文件意味着必须使用一些存储空间来储存拷贝的文件。有时候出于某种原因,可能想要创建“快捷方式”或者链接到文件,而不是拷贝。要做到这一点,可以使用 -l
选项。
[wang@localhost doc]$ ls -lvi debug.log
4243086 -rw-rw-r--. 1 wang wang 368640 9月 30 16:23 debug.log
[wang@localhost doc]$ cp -l debug.log /home/wang/script/
[wang@localhost doc]$ ls -lvi /home/wang/script/debug.log
4243086 -rw-rw-r--. 2 wang wang 368640 9月 30 16:23 /home/wang/script/debug.log
可以看出,我们看到 debug.log 的硬链接已经拷贝到 /home/wang/script/目录下,并标记有同样的 inode 4243086。
5.创建文件的符号链接
如果要创建软链接(符号链接),用 -s
选项来实现。
[wang@localhost doc]$ cp -s /home/wang/script/debug.log debug_link.log
[wang@localhost doc]$ ls -l debug_link.log
lrwxrwxrwx. 1 wang wang 27 10月 19 15:59 debug_link.log -> /home/wang/script/debug.log
注意:创建符号链接只能在当前目录下进行。
6.不随符号链接拷贝原文件
只拷贝符号链接文件,可以用 -P
选项来实现。当对符号链接使用 cp 命令,它会照原样拷贝它自身。
[wang@localhost doc]$ ls -l debug_link.log
lrwxrwxrwx. 1 wang wang 27 10月 19 15:59 debug_link.log -> /home/wang/script/debug.log
[wang@localhost doc]$ cp -P debug_link.log debug_link2.log
[wang@localhost doc]$ ls -l debug_link2.log
lrwxrwxrwx. 1 wang wang 27 10月 19 16:06 debug_link2.log -> /home/wang/script/debug.log
显然,cp 命令照原样拷贝 debug_link.log 自身,文件类型仍然是一个符号链接。
7.随符号链接拷贝原文件
可以试一下 -L
选项。基本上,这个刚好与上面的 -P
选项相反。
[wang@localhost doc]$ ls -l debug_link.log
lrwxrwxrwx. 1 wang wang 27 10月 19 15:59 debug_link.log -> /home/wang/script/debug.log
[wang@localhost doc]$ cp -L debug_link.log debug_link3.log
[wang@localhost doc]$ ls -l debug_link3.log
-rw-rw-r--. 1 wang wang 368640 10月 19 16:09 debug_link3.log
使用这个选项,拷贝的文件将会和 debug_link.log 原文件一样。可以从文件大小看出来。拷贝的文件有 368640 字节,而当 debug_link.log 作为符号链接时文件大小只有 27 字节。
8.文件归档
当拷贝一个目录时,会用 -r
或者 -R
选项。但是也可以用 -a
选项来归档文件。这样会创建文件和目录的准确套录,如果有的话也可以包括符号链接。
[wang@localhost ~]$ ls -l doc
总用量 360
drwxrwxr-x. 2 wang wang 57 10月 19 15:54 c++
lrwxrwxrwx. 1 wang wang 27 10月 19 15:59 debug_link.log -> /home/wang/script/debug.log
-rw-rw-r--. 1 wang wang 368640 10月 19 15:53 debug.log
drwxrwxr-x. 2 wang wang 30 10月 19 15:53 linux
[wang@localhost ~]$ cp -a doc /home/wang/program/
[wang@localhost ~]$ ls -l /home/wang/program/doc/
总用量 360
drwxrwxr-x. 2 wang wang 57 10月 19 15:54 c++
lrwxrwxrwx. 1 wang wang 27 10月 19 15:59 debug_link.log -> /home/wang/script/debug.log
-rw-rw-r--. 1 wang wang 368640 10月 19 15:53 debug.log
drwxrwxr-x. 2 wang wang 30 10月 19 15:53 linux
上列的命令会拷贝一个名为 doc 的目录到 /home/wang/program 目录下,debug_link.log 依然作为符号链接被复制。
9.显示详细的进行步骤
默认情况下,当拷贝成功时,仅会再次看到命令提示符。如果想了解在拷贝文件时都发生了什么,可以用 -v
选项。
[wang@localhost c++]$ cp -v *.pdf /home/wang/program/
"qt5_cadaques.pdf" -> "/home/wang/program/qt5_cadaques.pdf"
"qwt.pdf" -> "/home/wang/program/qwt.pdf"
10.使用交互模式
使用 -i
选项,启用交互模式,会询问是否覆盖目标目录下的文件。
[wang@localhost c++]$ cp -i qwt.pdf /home/wang/program/
cp:是否覆盖"/home/wang/program/qwt.pdf"? y
11.创建备份文件
当目标目录已经含有同名文件,默认情况下 cp 命令会覆盖目标目录下的同名文件。使用 --backup
选项,cp 命令会为每一个现有的目标文件做一个备份。
[wang@localhost c++]$ cp -bv qwt.pdf /home/wang/program/
"qwt.pdf" -> "/home/wang/program/qwt.pdf" (备份:"/home/wang/program/qwt.pdf~")
[wang@localhost c++]$ ls -l /home/wang/program/
总用量 12400
drwxrwxr-x. 4 wang wang 65 10月 19 16:21 doc
-rw-r--r--. 1 wang wang 7484327 10月 19 16:27 qt5_cadaques.pdf
-rw-r--r--. 1 wang wang 2604948 10月 19 16:35 qwt.pdf
-rw-r--r--. 1 wang wang 2604948 10月 19 16:32 qwt.pdf~
目标目录下出现了名为 qwt.pdf 和 qwt.pdf~ 的文件,波浪符号(~)意味着文件是备份文件。从属性中可以看到,备份文件比 qwt.pdf 要旧。
12.只拷贝文件属性
选项 --attributes-only
,顾名思义,只会拷贝文件名及其属性,不会拷贝任何数据。
[wang@localhost c++]$ cp --attributes-only hello.c hello_attr_only.c
[wang@localhost c++]$ ls -l hello*
-rw-rw-r--. 1 wang wang 0 10月 19 16:41 hello_attr_only.c
-rw-rw-r--. 1 wang wang 60 10月 19 15:53 hello.c
可以看出,原文件 hello.c 有 60 字节大小,拷贝的文件只有 0 字节大小,这是因为文件内容并没有拷贝。
13.强制拷贝
使用 -f
选项会强制进行拷贝操作。如果目标文件不能打开,可以用 -f
尝试。
[wang@localhost c++]$ cp -fv hello.c hello2.c
"hello.c" -> "hello2.c"