cp 是 copy(复制)的缩写,用于将文件或目录从一个位置复制到另一个位置。

基本语法
cp 命令的基本语法如下:
cp [选项] 源文件 目标文件 cp [选项] 源文件... 目标目录
- 源文件:你想复制的文件或目录的路径。
- 目标文件:复制后文件的新路径或新名称。
- 目标目录:如果将多个源文件复制到一个地方,那么最后一个参数必须是一个目录。
最常用的用法示例
复制单个文件
这是最简单的用法,将一个文件复制到另一个位置。
# 将 file1.txt 复制到 /home/user/documents/ 目录下,文件名不变 cp file1.txt /home/user/documents/ # 将 file1.txt 复制到当前目录,并重命名为 file1_backup.txt cp file1.txt file1_backup.txt
复制多个文件到指定目录
如果你想一次性复制多个文件到同一个文件夹,可以这样操作。
# 将 file1.txt, file2.txt, file3.txt 全部复制到 /home/user/documents/ 目录 cp file1.txt file2.txt file3.txt /home/user/documents/
复制整个目录(递归复制)
默认情况下,cp 命令无法直接复制目录,因为它不知道你是否想复制目录本身还是目录里的内容,要复制目录,必须使用 -r(递归)或 -R 选项。

# -r 或 -R 表示递归复制,会复制目录及其内部的所有文件和子目录 # 将 my_folder 目录复制到 /home/user/documents/ 下,成为 /home/user/documents/my_folder cp -r my_folder /home/user/documents/
注意:在较新的 Linux 发行版中,推荐使用
-a选项,因为它不仅递归,还保留了文件的所有属性(如权限、时间戳等)。
常用选项(Flags)
cp 命令的强大之处在于它的各种选项,可以满足复杂的复制需求。
| 选项 | 长选项 | 描述 | 示例 |
|---|---|---|---|
-i |
--interactive |
交互式,如果目标文件已存在,会提示你是否覆盖。(强烈推荐,防止误操作) | cp -i file1.txt file2.txt |
-r |
--recursive |
递归,用于复制目录及其所有内容。 | cp -r dir1/ dir2/ |
-v |
--verbose |
详细,显示正在复制的文件列表。 | cp -v file1.txt file2.txt |
-f |
--force |
强制,如果目标文件已存在且没有写权限,会尝试删除它后再复制,不推荐轻易使用。 | cp -f source.txt dest.txt |
-a |
--archive |
归档,这是一个非常强大的选项,相当于 -dR --preserve=all,它会递归地复制文件,并保留所有属性(权限、所有者、时间戳、符号链接等),在备份时非常有用。 |
cp -a my_project/ my_project_backup/ |
-u |
--update |
更新,只有当源文件比目标文件新,或者目标文件不存在时,才进行复制,非常适合用于脚本中同步目录。 | cp -u *.txt /backup/ |
-p |
--preserve |
保留属性,除了权限,还可以保留所有者、组、时间戳等,可以指定要保留的属性,如 -p -p 或 -p permissions。 |
cp -p config.ini /etc/ |
-l |
--link |
硬链接,创建源文件的硬链接,而不是复制文件,这会节省磁盘空间。 | cp -l large_file.txt linked_file.txt |
-s |
--symbolic-link |
符号链接,创建源文件的符号链接(软链接)。 | cp -s /usr/bin/python /usr/local/bin/py |
核心概念与注意事项
覆盖警告与 -i 选项
cp 命令最危险的地方就是它会静默地覆盖已存在的文件,而没有任何提示。
# 假设 dest.txt 已经存在 cp source.txt dest.txt
source.txt 和 dest.txt 内容不同,dest.txt 的内容会被直接替换,且你不会收到任何警告。

解决方案:养成使用 -i 的习惯!
# dest.txt 已存在,系统会提示你 $ cp -i source.txt dest.txt cp: overwrite 'dest.txt'? y # 输入 'y' 确认,输入 'n' 或其他任意键取消
安全提示:你可以通过
alias命令为cp设置一个默认别名,让cp命令默认就是-i模式。alias cp='cp -i'将这行添加到你的
~/.bashrc或~/.zshrc配置文件中,就可以永久生效。
源和目标的区别
- 如果目标是文件:
cp file1 file2会将file1的内容复制到file2,file2不存在,则创建它;如果存在,则覆盖它。 - 如果目标是目录:
cp file1 /path/to/dir会将file1复制到/path/to/dir目录内部,文件名仍然是file1。
复制 vs 移动
cp是复制,源文件和目标文件会同时存在。mv是移动/重命名,操作后源文件会消失,目标文件出现。
综合实例
假设我们有以下文件结构:
.
├── documents/
│ ├── report.txt
│ └── notes/
│ └── idea.md
└── photos/
└── vacation.jpg
场景1:备份整个 documents 目录,并保留所有属性。
cp -a documents/ documents_backup/
这会创建一个 documents_backup 目录,其内部结构和属性与 documents 完全一致。
场景2:将 report.txt 和 idea.md 复制到桌面,如果文件已存在则提示。
cp -i documents/report.txt documents/notes/idea.md ~/Desktop/
场景3:只将比 backup/ 目录中更新的文件复制过去。
# 首先确保备份目录存在 mkdir -p backup # 执行更新复制 cp -u documents/* backup/
场景4:创建一个文件的符号链接。
# 在 /usr/local/bin/ 目录下创建一个指向 /usr/bin/python3 的快捷方式 'py' sudo cp -s /usr/bin/python3 /usr/local/bin/py
| 需求 | 推荐命令 |
|---|---|
| 复制单个文件 | cp source.txt dest.txt |
| 复制文件到目录 | cp source.txt /path/to/dir/ |
| 复制目录 | cp -r source_dir/ dest_dir/ |
| 安全复制(防覆盖) | cp -i source.txt dest.txt |
| 显示复制过程 | cp -v source.txt dest.txt |
| 完美备份目录(保留所有属性) | cp -a source_dir/ dest_dir/ |
| 只复制更新的文件 | cp -u source_dir/ dest_dir/ |
掌握 cp 命令是使用 Linux/Unix 终端的基础,特别是 -i、-r、-v 和 -a 这几个选项,在日常工作中会频繁使用,请务必养成使用 -i 的好习惯,避免数据丢失。
