cp -r 复制整个文件夹时目标出现嵌套结构,是因为源路径未加末尾斜杠(如 cp -r dir1 /dst/ 会创建 /dst/dir1/);加斜杠(dir1/)才实现“解包式复制”;默认不保留权限等元数据,需加 -p 或 -a;大目录复制建议用 rsync -avh --progress 查看进度。

cp 不需要安装,它是所有 Linux 发行版默认自带的命令。 你直接在终端输入 cp --version 就能确认是否存在;如果报错,说明系统异常(极罕见),不是“没安装”的问题。
为什么 cp -r 复制整个文件夹后目标目录里多了一层同名子目录?
这是路径写法导致的最常见误操作。比如执行:
cp -r /home/user/project /backup/
实际效果是把 /home/user/project 这个目录(含自身目录名)整个复制进 /backup/,结果得到 /backup/project/。如果你想要的是 /backup/ 下直接是 project 里的内容(即“解包式复制”),应该加一个斜杠:
cp -r /home/user/project/ /backup/
注意源路径末尾的 / —— 它告诉 cp “取这个目录下的所有内容”,而不是“把这个目录本身”复制过去。
- 源路径带末尾
/(如dir1/):复制目录内所有项,不包含dir1自身 - 源路径不带末尾
/(如dir1):复制整个目录,包括dir1这个名字 - 目标路径末尾是否加
/通常不影响行为,但建议统一加,避免和某些工具链冲突
cp -r 复制后权限、时间戳全变了,怎么保留原样?
默认 cp -r 只复制文件内容,不保留所有权、权限、修改时间等元数据。要完整克隆,必须加 -p 或更彻底的 -a:
cp -rp dir1/ dir2/ # 保留权限、所有者、时间戳
cp -a dir1/ dir2/ # 推荐:等价于 -dR --preserve=all,还保留符号链接、ACL、SELinux 上下文等
注意:-a 在大多数现代系统上可用,但老版本(如 CentOS 6)可能不支持 --preserve=all,此时用 -rp 更稳妥。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 普通用户执行
-p或-a时,若源文件属主不是自己,可能无法还原所有者(会静默降级为当前用户) - 想强制还原属主,需配合
sudo,但要注意安全风险 -
-a不等于-r + -p:它还隐含-d(不展开软链接),这点常被忽略
复制大目录时卡住没反应,怎么知道进度?
cp 原生命令不支持实时进度条,-v 只是列出每个文件名,对大目录几乎无用。真正实用的方案有两个:
方案一:用 rsync 替代(推荐)
rsync -avh --progress /source/ /destination/
其中 -h 输出人类可读大小,--progress 显示实时传输速率和剩余时间。
方案二:用 pv + tar 组合(适合单一大目录)
tar -cf - /source | pv | tar -xf - -C /destination
这会把整个目录打包流式传输,并通过 pv 显示总进度。注意:该方式不保留硬链接,且临时占用内存稍高。
- 别依赖
cp -v判断大目录复制是否卡死——它只在开始/结束打点,中间完全沉默 - 如果目标是另一块磁盘或远程挂载点,IO 等待可能长达数分钟无输出,属正常现象
-
rsync的--delete要慎用,首次同步别加,避免误删
真正容易出问题的不是选项记不住,而是路径末尾斜杠的有无、以及对 -a 和 -p 行为差异的误判——这两个细节一旦写错,轻则多一层目录,重则权限丢失、软链接变死链。










