Ubuntu Server 16下cp -av复制目录目标路径不一致求助
嘿,我完全懂你这种困惑——明明都是用cp -av复制同一个Doubling目录,结果两次的目标路径却不一样,确实挺让人摸不着头脑的。咱们来一步步拆解问题根源,再给你搞定的办法:
核心原因:cp对源目录末尾斜杠的处理差异
这是cp命令里一个非常容易踩的“小坑”,结果完全取决于两个细节:源目录末尾是否加斜杠,以及目标目录是否预先存在。
1. 你第一条命令符合预期的原因
假设你第一条命令是这样写的:
cp -av Doubling/ /src/main/scala
注意Doubling后面的斜杠——这个斜杠告诉cp:“我要复制这个目录里面的所有内容,而不是复制目录本身”。
加上/src/main/scala这个目录已经存在,所以cp直接把Doubling里的文件和子目录都放到了/src/main/scala下面,完全符合你的需求。
2. 第二条命令多出一层scala的原因
大概率你第二条命令没加那个关键的斜杠,写成了:
cp -av Doubling /src/test/scala
这时候如果/src/test/scala这个目录不存在,cp就会把整个Doubling目录重命名为/src/test/scala。而如果你的Doubling目录内部本身就有一个叫scala的子目录,那自然就会出现/src/test/scala/scala的结果——相当于把整个Doubling搬过去,里面的scala子目录也跟着过来了。
怎么解决?
根据你的需求(把Doubling的内容复制到目标路径),按下面的方式操作就不会错:
方法1:统一用带斜杠的源目录,提前创建目标路径
# 先确保目标路径存在,不存在就自动创建父目录 mkdir -p /src/test/scala # 复制Doubling里的内容到目标目录 cp -av Doubling/ /src/test/scala
方法2:一条命令搞定(目标末尾也加斜杠更明确)
cp -av Doubling/ /src/test/scala/
目标路径末尾的斜杠也能明确告诉cp:“我要把内容放到这个目录下”,就算目标目录不存在,cp也会先创建它,再把内容复制进去,不会出现重命名整个源目录的情况。
小技巧:提前验证目标路径
你可以先执行这条命令看看目标目录是否存在:
ls -ld /src/test/scala
- 如果输出是类似
drwxr-xr-x 2 root root 4096 Aug 10 12:34 /src/test/scala,说明目录已存在 - 如果提示
ls: cannot access '/src/test/scala': No such file or directory,说明目录不存在,这时候一定要用带斜杠的源目录写法,避免踩坑。
内容的提问来源于stack exchange,提问作者Jake




