欢迎各位兄弟 发布技术文章
这里的技术是共享的
linux cp -a /tmp/dira/. /tmp/dirb 详解
cp -a /tmp/dira/. /tmp/dirb
命令这个 Linux cp
命令用于复制 /tmp/dira/
目录中的所有内容(包括隐藏文件)到 /tmp/dirb/
目录中,同时保留所有文件属性和时间戳。
cp
: 复制文件和目录的基本命令
-a
: 等同于 -dR --preserve=all
,表示:
保留所有文件和目录的原始属性(包括权限、所有权、时间戳)
递归复制目录
不跟随符号链接(复制链接本身而非链接指向的内容)
/tmp/dira/.
: 源路径
/tmp/dira/
是源目录
末尾的 .
表示"目录内的内容"而非目录本身
/tmp/dirb
: 目标路径
将 /tmp/dira/
内所有文件和子目录(包括隐藏文件)复制到 /tmp/dirb/
目录中
不会在 /tmp/dirb/
目录下创建额外的 dira
子目录
所有复制的文件将保留原始权限、所有权和时间戳
如果 /tmp/dirb
不存在,命令会失败;如果存在,内容将被合并
cp -a /tmp/dira/* /tmp/dirb/
→ 类似但不包括隐藏文件(以点开头的文件)
rsync -a /tmp/dira/ /tmp/dirb/
→ 使用 rsync 达到类似效果
路径末尾的 /
和 .
会影响行为:
cp -a /tmp/dira /tmp/dirb
→ 会创建 /tmp/dirb/dira
cp -a /tmp/dira/ /tmp/dirb
→ 与使用 /.
效果相同
如果目标目录已有同名文件,可能会被覆盖
需要足够的权限才能保留所有权信息(通常需要 root 权限)
使用 -a
时,大文件复制可能导致时间戳保留失败(被修改)
cp -rf 与 cp -a 区别 ,示例
cp -rf
与 cp -a
的区别详解参数组合 | 功能特点 | 保留元数据 | 递归复制 | 处理符号链接 |
---|---|---|---|---|
-rf | 强制递归复制 | 不保留 | 是 | 跟随链接 |
-a | 归档模式复制 | 全部保留 | 是 | 不跟随链接 |
cp -rf
(递归强制复制)-r
: 递归复制目录及其内容
-f
: 强制复制,覆盖目标文件时不提示
不保留:
文件权限、所有权、时间戳等元数据
符号链接会被解引用(复制链接指向的内容而非链接本身)
bashcp -rf /source/dir /destination/ # 结果: # /destination/dir/ 包含源目录所有内容 # 所有文件会使用默认权限(如644) # 符号链接指向的内容会被实际复制
cp -a
(归档模式复制)等同于 -dR --preserve=all
保留所有:
文件权限(-p)
所有权(需足够权限)
时间戳
链接属性(-d)
递归复制目录(-R)
不跟随符号链接(-d)
bashcp -a /source/dir /destination/ # 结果: # /destination/dir/ 包含源目录所有内容 # 所有文件保留原始权限、所有者和时间戳 # 符号链接保持为链接(不跟随)
bash# 使用 -a 保留所有属性(推荐用于备份) cp -a /var/www/html /backups/html_backup # 使用 -rf 会丢失权限信息(不推荐) cp -rf /var/www/html /backups/html_backup
bash# 使用 -a 保留git仓库的所有权限和符号链接 cp -a ~/project /mnt/external_drive/ # 使用 -rf 会导致.git目录的权限变化,可能损坏仓库 cp -rf ~/project /mnt/external_drive/
使用 -a
需要足够的权限来保留所有权信息,通常需要sudo
-rf
更适合快速复制内容而不关心元数据的场景
-a
会保留符号链接本身,-rf
会解引用符号链接
对于跨文件系统复制,-a
可能无法保留某些特殊属性
对于更复杂的复制需求,可以考虑使用:
bashrsync -aX /source/ /destination/ # 更灵活的归档复制