cp 报错 cannot overwrite non-directory:目录被同名文件占位

某次要把 pojie/ 目录复制进 wpa-dictionary/ 里,cp 一直报错:

$ cp -r pojie/ wpa-dictionary/pojie
cp: cannot overwrite non-directory 'wpa-dictionary/pojie' with directory 'pojie/'

$ cp -r pojie wpa-dictionary/
cp: cannot overwrite non-directory 'wpa-dictionary/pojie' with directory 'pojie'

$ cp -f pojie wpa-dictionary/
cp: -r not specified; omitting directory 'pojie'

问题原因

这个报错不是 cp 参数写错了,而是 目标路径 wpa-dictionary/pojie 已经存在一个普通文件cp 不允许用目录去覆盖一个非目录。

先用 ls -l 确认:

$ ls -l wpa-dictionary/pojie
-rw-r--r-- 1 root root 1234 Jun 15 10:00 wpa-dictionary/pojie

看到开头是 - 说明它是普通文件。而你想执行的 cp -r pojie wpa-dictionary/ 实际上等于 cp -r pojie wpa-dictionary/pojie——目标名字已经被文件占了。

三种处理方式

方案一:删除同名文件

如果目标位置那个文件本来就没用,直接删掉再复制:

rm -f wpa-dictionary/pojie
cp -r pojie wpa-dictionary/

方案二:换个目标名

不想删旧文件的话,改个新名字:

cp -r pojie wpa-dictionary/pojie_new

方案三:先看清目录结构

tree 看一眼当前目录状态,避免以后再踩:

tree -L 2 .

或者两条 ls -ld 直接对比属性:

ls -ld pojie
ls -ld wpa-dictionary/pojie

看到一个是 d 开头(目录)、一个是 - 开头(文件),就知道冲突在哪里了。

一句话总结

cp: cannot overwrite non-directory = 目标位置已被同名普通文件占位。要么删掉旧文件,要么换个目标名。