cp(copy)是Linux/Unix系统中用于复制文件和目录的基础命令。它能够在同一位置创建文件副本,或在不同目录之间复制文件,是文件管理中最常用的命令之一。
cp命令支持单文件复制、多文件复制、递归目录复制等多种操作模式,并提供丰富的选项来控制覆盖行为、保留文件属性、创建链接等。掌握cp是日常文件管理和脚本编写的基础技能。
1. 基本语法
| 命令 | 说明 |
|---|
cp [options] source dest | |
cp [options] source... directory | |
cp -r [options] source dest | |
cp -- file.txt dest/ | |
cp -v file.txt dest/ | |
2. 复制文件
| 命令 | 说明 |
|---|
cp file.txt /tmp/ | |
cp file.txt newname.txt | |
cp file1.txt file2.txt /backup/ | |
cp *.log /var/log/archive/ | |
cp /src/file.txt /dest/newname.txt | |
cp -R . /backup/ | |
3. 复制目录
| 命令 | 说明 |
|---|
cp -r directory/ /dest/ | |
cp -r dir1 dir2 /dest/ | |
cp -r /src/dir /dest/dir-new | |
cp -r dir/. /dest/ | |
cp -r dir/ /dest/dir/ | |
cp -a /src/dir /dest/ | |
4. 覆盖控制
示例:
cp -i file.txt dest/ # 覆盖前询问cp -n file.txt dest/ # 如果dest/file.txt存在则跳过cp -u file.txt dest/ # 仅当源文件更新时复制cp -b file.txt dest/ # 覆盖前创建file.txt~备份
5. 保留属性
| 选项 | 说明 |
|---|
-p | |
-a | 归档模式(-dR --preserve=all)递归并保留所有属性 |
-d | |
--preserve=timestamps | |
--preserve=mode | |
--preserve=ownership | |
--preserve=all | |
-a vs -p 区别:
-a:归档模式 = -dR --preserve=all(递归+保留所有属性+保留链接)
6. 创建链接
| 选项 | 说明 |
|---|
-s | |
-l | |
-s -f | |
-s target link_name | |
示例:
cp -s /path/to/target link_name # 创建符号链接cp -l file.txt hardlink.txt # 创建硬链接
7. 实用组合模式
| 命令 | 说明 |
|---|
cp file.txt{,.bak} | |
cp -v file.txt dest/ | |
cp -rv dir/ dest/ | |
cp -a /src/. /dest/ | |
find . -name '*.conf' -exec cp -t /backup/ {} + | |
cp -u *.log /backup/ | |
cp --parents file1.txt file2.txt dest/ | |
cp -r --no-target-directory src/ dest/ | |
8. 高级复制选项
| 选项 | 说明 |
|---|
-R | |
-L | |
-P | |
--parents | |
-T | |
-t | |
-x | |
--remove-destination | |
-t 用法示例:
# 将目标目录放在前面find . -name "*.log" -exec cp -t /backup/ {} +
9. 常用选项速查
| 选项 | 完整名称 | 说明 |
|---|
-r | | |
-R | | |
-i | | |
-n | | |
-f | | |
-u | | |
-p | | |
-a | | |
-v | | |
-b | | |
-s | | |
-l | | |
-L | | |
-T | | |
-t | | |
10. cp vs mv 对比
11. 故障排查
| 问题 | 解决方法 |
|---|
| cp: omitting directory | |
| Permission denied | |
| No such file or directory | |
| 目标文件被意外覆盖 | |
| 属性没有保留 | |
| 复制大量小文件很慢 | 使用tar打包后传输:`tar cf - . | (cd /dest && tar xf -) |
| 符号链接复制后失效 | |
| 磁盘空间不足 | |
温馨提示: cp是高风险操作,建议遵循以下原则:1)批量操作前使用-i确认或先用ls预览;2)备份重要文件使用-b自动创建备份;3)复制配置文件时使用-p或-a保留权限和时间戳;4)镜像目录时使用-a保留所有属性;5)使用-u避免覆盖较新的文件。在脚本中使用cp时,建议使用-n防止意外覆盖,或使用-u进行增量复制。对于大文件或大量小文件的复制,考虑使用rsync替代cp,它支持断点续传和增量同步。