Linux拷贝命令cp的一点总结(附cannot overwrite directory xxx with non-directory)

本文总结了Linux `cp`命令在拷贝目录时的行为,特别是在不覆盖原有目录的情况下。通过实例展示了`cp -r`如何处理源目录和目标目录中的文件和子目录,以及如何使用交互式选项`-i`防止意外覆盖。同时,文章提到了遇到的`cannot overwrite directory xxx with non-directory`错误,分析了该错误的原因并提供了避免此类问题的建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天验证一个补丁,补丁是以old/new形式给出的,需要自行合入到代码工程中去,得到建议说可以把new文件夹中的东西拷贝到工程中即可,但对比了new文件夹与工程中对应文件夹的内容,涉及到三方面

1.new文件夹中有新增的独有文件

2.new文件夹与工程同名代码部分需要覆盖

3.原工程文件夹独有的文件需要保留

忽然一下没了头绪,因为发给客户的补丁不能出错,怕自己对比来对比去最终晕头转向,又得到建议可以在linux下用cp -r命令,虽然用惯了cp -r,但是都是往空白处拷贝,潜意识认为cp -r命令会覆盖整个目标,但是结果并不是如此

由此模拟了一个简单的场景,看看cp -r到底是什么行为

先把cp的选项罗列如下:

-a:此参数的效果和同时指定"-dpR"参数相同;
-d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录;
-f:强行复制文件或目录,不论目标文件或目录是否已存在;
-i:覆盖既有文件之前先询问用户;
-l:对源文件建立硬连接,而非复制文件;
-p:保留源文件或目录的属性;
-R/r:递归处理,将指定目录下的所有文件与子目录一并处理;
-s:对源文件建立符号连接,而非复制文件;
-u:使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时,才复制文件;
-S:在备份文件时,用指定的后缀“SUFFIX”代替文件的默认后缀;
-b:覆盖已存在的文件目标前将目标文件备份;
-v:详细显示命令执行的操作。

自建场景如下:

两个文件夹source和dest

----------------------------------------------------------

source中有两个文件夹:one和two

one中有文件1.txt(内容为source:1.txt); one中有文件1_source.txt(内容为1_source.txt)

two中有文件2.txt(内容为source:2.txt); two中有文件2_source.txt(内容为2_source.txt)

-----------------------------------------------------------

de

<think>好的,用户遇到了Linux中使用cp命令时报错“cannot overwrite non-directory with directory”的问题,需要解决方法。首先,我需要分析这个错误的原因。通常在尝试复制目录到目标路径时,如果目标路径已经存在同名的非目录文件(比如普通文件或符号链接),就会触发这个错误。因为默认情况下,cp命令不允许用目录覆盖非目录类型的文件。 接下来,我需要回忆cp命令的相关选项。记得有一个选项是-T或--no-target-directory,可以避免将目标视为目录,但不确定具体用法。另外,-f或--force选项可能用于强制覆盖,但可能在某些情况下无效,尤其是在覆盖目录和非目录时。需要验证这些选项的适用性。 然后,用户可能需要不同的解决方案。比如,如果目标是一个文件,用户可能想删除它再复制目录;或者使用rsync代替cp来处理更复杂的同步需求。同时,要考虑用户是否有权限删除目标文件,或者是否需要保留原文件。 还需要检查用户提供的引用内容是否有相关提示。查看引用[1]提到链接步骤的问题,可能与库路径有关,但和cp命令无关。引用[2]关于CUDA仓库的优先级设置,也不相关。引用[3]提到Ant的类路径设置,同样不适用。因此,这些引用可能没有直接帮助,解决方案需要依赖Linux命令知识。 最后,整理解决方案步骤,包括使用-T选项、删除目标文件、使用rsync,以及避免在目标路径末尾加斜杠的情况。同时,提醒用户操作前备份,避免数据丢失。</think>### 解决 `cp` 命令报错 "cannot overwrite non-directory with directory" #### 错误原因分析 当使用 `cp` 命令复制目录到目标路径时,若目标路径已存在同名文件(非目录类型,如普通文件或符号链接),系统会拒绝覆盖操作并抛出此错误。这是因为 `cp` 默认不允许用目录覆盖非目录类型的文件[^1]。 #### 解决方法 1. **使用 `-T` 选项强制覆盖** 添加 `-T` 参数,明确将目标视为普通文件而非目录: ```bash cp -rT /源目录/ 目标路径 ``` 此命令会递归复制源目录内容到目标路径,若目标存在同名文件则直接覆盖。 2. **手动删除目标文件后再复制** 若需保留目标路径的其他文件,可先删除冲突文件: ```bash rm -f 目标路径 && cp -r /源目录/ 目标路径 ``` 3. **使用 `rsync` 替代 `cp`** `rsync` 提供更灵活的文件同步逻辑,支持覆盖非目录文件: ```bash rsync -a --delete /源目录/ 目标路径/ ``` 4. **检查目标路径格式** 若目标路径末尾误加了 `/`(如 `目标路径/`),可能导致系统误判为目录。修正路径格式: ```bash cp -r /源目录 目标路径 # 正确 cp -r /源目录 目标路径/ # 可能触发错误 ``` #### 注意事项 - **备份数据**:覆盖操作可能导致数据丢失,建议提前备份重要文件。 - **权限检查**:确保对目标路径有写入权限(可使用 `ls -l` 验证)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值