Linux cp 命令超详细教程
cp(copy)是 Linux 复制文件/目录的核心命令,支持单文件、多文件、整目录复制、覆盖、保留属性、递归复制等场景,下面分语法、常用参数、实战案例、避坑要点逐一讲解。
一、基础语法
bash
# 1. 复制单个文件
cp [选项] 源文件 目标文件
# 2. 复制多个文件/文件到目录
cp [选项] 源文件1 源文件2 ... 目标目录
# 3. 复制目录(必须加递归参数)
cp [选项] 源目录 目标目录
规则:
- 目标已存在是目录:源文件/目录会放进该目录内
- 目标不存在:新建目标(文件/目录)并重命名
- 目标已存在是文件:默认直接覆盖内容
二、常用核心参数(高频必记)
| 参数 | 作用 |
|---|---|
-r / -R |
递归复制目录(复制文件夹必备) |
-f |
强制覆盖,不提示(force) |
-i |
覆盖前交互式询问(安全模式) |
-v |
显示复制过程(verbose,可视化进度) |
-p |
保留文件权限、时间戳、属主等属性 |
-a |
归档模式 = -r + -p + 保留软链接,复制目录首选 |
-n |
不覆盖已有文件(no clobber) |
-u |
仅复制源文件比目标新或目标不存在的文件(增量更新) |
-s |
创建软链接(而非复制文件) |
三、实战案例(从简单到复杂)
1. 复制单个文件
① 同目录复制(改名)
bash
# 把 test.txt 复制为 test_bak.txt
cp test.txt test_bak.txt
② 复制到其他目录(文件名不变)
bash
# 将 test.txt 复制到 /home/user/ 目录
cp test.txt /home/user/
③ 复制到目录并改名
bash
cp test.txt /home/user/new_test.txt
2. 安全复制(覆盖前询问 -i)
系统默认部分环境已别名 alias cp='cp -i',手动执行:
bash
cp -i test.txt /home/user/
# 若目标已存在,会提示:cp: 是否覆盖 "xxx"? 输入 y 确认,n 取消
3. 强制覆盖(不弹窗 -f)
批量复制、脚本中常用:
bash
cp -f test.txt /home/user/
4. 复制多个文件
bash
# 把 file1 file2 file3 全部复制到 /tmp 目录
cp file1 file2 file3 /tmp/
# 通配符 * 批量复制同类型文件
cp *.txt /tmp/ # 所有 .txt 文件
cp log* /tmp/ # 所有以 log 开头的文件
5. 复制目录(重点)
普通
cp无法直接复制文件夹,必须加-r/-a
① 递归复制目录 -r
bash
# 复制 dir1 整个目录到 dir2 内
cp -r dir1 dir2
② 归档模式(生产环境首选 -a)
保留权限、时间、软链接,备份目录最优:
bash
cp -a dir1 /backup/
③ 显示复制详情 -v
搭配 -a 查看每一个文件复制过程:
bash
cp -av dir1 /backup/
6. 增量复制(只更新新文件 -u)
适合反复同步文件,跳过未改动文件:
bash
cp -ru dir1 /backup/
7. 不覆盖已有文件 -n
bash
cp -n test.txt /tmp/
# 目标存在则直接跳过,无任何提示
8. 保留文件属性 -p
复制后修改时间、权限、所有者不变:
bash
cp -p test.txt /tmp/
9. 创建软链接(替代复制)-s
bash
cp -s /opt/app /tmp/app_link
# 等价 ln -s 源 链接名,只创建快捷方式,不复制实体文件
四、典型组合用法(工作常用)
- 安全备份目录(推荐日常使用)
bash
cp -av 源目录 目标目录
- 批量强制复制所有文件,不询问
bash
cp -rf *.log /data/logs/
- 增量同步目录(定时同步场景)
bash
cp -ruv /data/src /data/dst
五、重要规则 & 避坑(高频踩坑点)
1. 目录复制两种结果区分
假设:dirA 存在,执行 cp -r dir1 dirA
- 结果:
dirA/dir1(把 dir1 放进 dirA 里面)
假设:dirA 不存在 ,执行 cp -r dir1 dirA
- 结果:新建
dirA,内容和dir1完全一致(等价改名复制)
2. 绝对路径 / 相对路径
- 相对路径:
cp test.txt ./tmp/(当前目录出发) - 绝对路径:
cp /root/test.txt /home/xxx/(全路径,跨目录通用)
3. 不要直接 cp 目录 已有文件
bash
# 错误用法:src 是目录,dest 是文件,会报错
cp src dest
4. 隐藏文件复制
通配符 * 默认不匹配 . 开头隐藏文件,复制全部(含隐藏):
bash
# 复制当前所有文件+隐藏文件到目标目录
cp -r ./* /target/
5. root 与普通用户权限问题
- 普通用户复制无读权限文件:提示权限不足
- 复制到无写权限目录 :报错
Permission denied
六、临时取消 -i 交互询问
如果系统默认 cp -i,想一次性强制覆盖不弹窗:
bash
# 临时使用原生 cp,忽略别名
\cp -f test.txt /tmp/
七、快速总结
- 复制单个/多个文件 :直接
cp [参数] 源 目标 - 复制文件夹 :必加
-r,生产备份优先用-a - 日常安全操作:
cp -iv;脚本/批量操作:cp -rf - 增量同步用
-u,不想覆盖用-n