cp 命令是 copy(复制)的缩写,用于将文件或目录从一个位置复制到另一个位置,它是 Linux 系统管理中不可或缺的工具。

基本语法
cp 命令的基本语法如下:
cp [选项] 源文件 目标文件 cp [选项] 源文件... 目标目录
语法解析:
[选项]: 用于控制cp命令的行为,例如是否覆盖、是否显示详细信息等。源文件: 你想要复制的文件或目录,可以是一个,也可以是多个(当目标是目录时)。目标文件: 复制后的新文件名或位置。- 如果目标是一个已存在的目录,
源文件会被复制到该目录下,并保持原名。 - 如果目标是一个不存在的文件名,
cp会创建一个与源文件内容相同但名称为目标文件的新文件。 - 如果目标是一个已存在的文件名,
源文件的内容会覆盖目标文件的内容(除非使用了-i选项)。 - 如果目标是一个目录,并且你复制的是多个源文件,那么所有源文件都会被复制到该目录下。
- 如果目标是一个已存在的目录,
常用选项
cp 命令的强大之处在于其丰富的选项,以下是常用且重要的选项:
| 选项 | 全称 | 描述 | 示例 |
|---|---|---|---|
-r 或 -R |
--recursive |
递归复制,用于复制整个目录,包括目录中的所有文件和子目录。 | cp -r dir1/ dir2/ |
-i |
--interactive |
交互式,在覆盖目标文件之前,会提示用户确认(输入 y 或 n)。强烈推荐在 Shell 别名中默认使用。 |
cp -i file1.txt file2.txt |
-f |
--force |
强制,如果目标文件已存在,且没有写权限,会尝试删除已存在的目标文件后再进行复制,如果目标文件是只读的,默认会覆盖。 | cp -f file1.txt /readonly_dir/file2.txt |
-v |
--verbose |
详细,显示 cp 命令执行的详细信息,例如正在复制哪些文件。 |
cp -v file1.txt file2.txt |
-p |
--preserve |
保留属性,尽可能保留源文件的所有属性,包括所有者、组、权限、时间戳等。 | cp -p config.conf /backup/ |
-a |
--archive |
归档,这是一个非常强大的选项,相当于 -dR --preserve=all,它递归地复制目录,并尽可能保留所有文件属性(权限、所有者、时间戳等),并且通常会创建硬链接而不是复制对于符号链接,常用于完整的备份。 |
cp -a my_project/ my_project_backup/ |
-u |
--update |
更新,只在源文件比目标文件新,或者目标文件不存在时才进行复制,非常适合用于脚本中定期同步文件。 | cp -u *.txt /archive/ |
-l |
--link |
创建硬链接,而不是复制文件,这会创建一个指向源文件 inode 的新文件名。 | cp -l original.txt hardlink.txt |
-s |
--symbolic-link |
创建符号链接(软链接),创建一个指向源文件路径的链接文件。 | cp -s /etc/hosts my_hosts |
-d |
--no-dereference |
不解除引用,当复制符号链接时,默认会复制链接指向的文件内容,此选项会复制链接本身,而不是其指向的内容,通常与 -r 或 -l 一起使用。 |
cp -d -r linked_dir/ new_dir/ |
--copy-contents |
在递归复制时,如果遇到符号链接,默认会复制链接指向的内容,此选项可以强制复制符号链接本身。 | cp -r --copy-contents src/ dest/ |
实践示例
示例 1:复制文件
# 复制 file1.txt 到 file2.txt cp file1.txt file2.txt # 复制 file1.txt 到 /home/user/documents/ 目录下,并重命名为 new_file.txt cp file1.txt /home/user/documents/new_file.txt
示例 2:复制目录
# 错误示范:直接复制目录会报错 cp dir1/ dir2/ # cp: omitting directory 'dir1/' # 提示忽略目录 # 正确方法:使用 -r 或 -R 选项递归复制 cp -r dir1/ dir2/ # 这会将 dir1 目录及其所有内容复制到 dir2 目录中,dir2 不存在,则会创建一个名为 dir2 的新目录,其内容与 dir1 相同。 # dir2 已经存在,dir1 目录会被复制到 dir2 内部,成为 dir2/dir1/
示例 3:结合多个选项
# 复制整个项目目录,保留所有属性,并显示详细过程 cp -av -p my_project/ /backups/my_project_20251027/ # 输出可能如下: # 'my_project/file.txt' -> '/backups/my_project_20251027/file.txt' # 'my_project/src/' -> '/backups/my_project_20251027/src/'
示例 4:使用 -i 选项防止意外覆盖
# 假设 file2.txt 已经存在 cp -i file1.txt file2.txt # 系统会提示:cp: overwrite 'file2.txt'? (y/n) # 输入 'y' 确认覆盖,输入 'n' 取消操作。
示例 5:使用 -u 选项进行增量备份
# 将当前目录下所有 .log 文件复制到 /archive/logs/ 目录 # 但只复制那些在 /archive/logs/ 中不存在或已过时的文件 cp -u *.log /archive/logs/
示例 6:创建链接
# 创建一个硬链接 cp -l original.txt hardlink.txt # ls -l original.txt hardlink.txt # -rw-r--r-- 2 user user 1024 Oct 27 10:00 hardlink.txt # -rw-r--r-- 2 user user 1024 Oct 27 10:00 original.txt # 注意:硬链接计数为 2,且 inode 号相同。 # 创建一个符号链接 cp -s original.txt symlink_to_original.txt # ls -l symlink_to_original.txt # lrwxrwxrwx 1 user user 12 Oct 27 10:01 symlink_to_original.txt -> original.txt # 注意:它以 'l' 开头,表示是链接,并指向目标文件。
重要注意事项与最佳实践
-
cp和mv的区别:
(图片来源网络,侵删)cp是 复制,操作后源文件仍然存在。mv是 移动/重命名,操作后源文件不存在了(在同一文件系统下是重命名,跨文件系统是复制+删除)。
-
防止意外覆盖:
alias cp='cp -i': 在大多数现代 Linux 发行版(如 Ubuntu, CentOS)的 Shell 配置文件(如~/.bashrc或~/.zshrc)中,cp命令通常被别名为cp -i,这意味着默认情况下,cp会是交互式的,能有效防止你误操作覆盖重要文件,你可以使用alias命令来查看当前的别名设置。
-
大文件复制:
- 对于非常大的文件,
cp命令可能会因为缓冲区大小等原因而显得较慢,如果需要更高效的复制,可以考虑使用rsync命令,它不仅可以高效复制,还支持断点续传和增量同步。
- 对于非常大的文件,
-
权限问题:
- 如果你没有权限读取源文件或写入目标位置,
cp命令会失败并报错,确保你有足够的权限(read对源,write对目标目录)。
- 如果你没有权限读取源文件或写入目标位置,
-
cp -avscp -r -p:
(图片来源网络,侵删)cp -a是--archive的缩写,它不仅递归复制(-R),还保留所有属性(--preserve=all),并且处理符号链接的方式更符合“归档”的预期(通常保留链接本身)。cp -r -p也能实现类似功能,但在处理某些特殊文件类型(如设备文件)时,cp -a的行为可能更符合预期。在需要完整备份目录时,cp -a是首选。
| 需求 | 推荐命令 |
|---|---|
| 简单复制文件 | cp source.txt dest.txt |
| 复制目录 | cp -r source_dir/ dest_dir/ |
| 安全复制(防止覆盖) | cp -i source.txt dest.txt (或确保 alias cp='cp -i') |
| 完整备份目录(保留所有属性) | cp -a source_dir/ backup_dir/ |
| 只复制新文件或缺失的文件 | cp -u source_dir/ dest_dir/ |
| 创建硬链接 | cp -l source.txt hardlink.txt |
| 创建符号链接 | cp -s source.txt symlink.txt |
掌握 cp 命令及其选项是每个 Linux 用户和管理员的基本功,通过理解 -r, -i, -p, -a 等核心选项,你可以在各种场景下安全、高效地管理你的文件和目录。
