cp -av /home/jake/transit/scalaProjects/scalaML/src/main/scala /home/jake/project/__workspace/scalaProjects/scalaML/src/main/scala
cp -av /home/jake/transit/scalaProjects/scalaML/src/test/scala /home/jake/project/__workspace/scalaProjects/scalaML/src/test/scala
第一行复制到 /src/main/scala
但
第二个复制到 /src/test/scala/scala
我在 Ubuntu 服务器 16 上。
我肯定我漏掉了什么,但我很困惑。如能得到任何帮助我将不胜感激
答案1
考虑cp a b/c
。
如果
c
不存在(并且b
存在),它将被解释为的副本的名称a
,因此您将以 结束b/c
。另一方面,如果确实存在并且它是一个目录,它将被解释为放置在未改变名称下的
c
路径,因此您将以 结束。a
a
b/c/a
我猜一开始/home/jake/project/__workspace/scalaProjects/scalaML/src/main/scala
就不存在,只有/home/jake/project/__workspace/scalaProjects/scalaML/src/main/
。
你的第一个命令创建了scala
acting as (1)。这可能有点令人困惑,因为你scala
用a
和 c
,因此不明显发生了一些琐碎的重命名(从scala
到scala
)。然后第二个命令充当 (2)。
此命令将作为您的第一个命令工作,无论目标是否scala
存在,只要/home/jake/project/__workspace/scalaProjects/scalaML/src/main/
存在:
cp -av /home/jake/transit/scalaProjects/scalaML/src/main/scala /home/jake/project/__workspace/scalaProjects/scalaML/src/main/
但如果/home/jake/project/__workspace/scalaProjects/scalaML/src/main/
不存在,而/home/jake/project/__workspace/scalaProjects/scalaML/src/
存在,你的scala
将被放置在名称为 下main
。这又是行为 (1)。
为了消除这种歧义,使用-t
:
cp -av /home/jake/transit/scalaProjects/scalaML/src/main/scala -t /home/jake/project/__workspace/scalaProjects/scalaML/src/main/
这会将cp
其解释main
为您想要放置的目录scala
。不会进行重命名。如果/home/jake/project/__workspace/scalaProjects/scalaML/src/main/
不存在,cp
则会抛出错误。
答案2
我找到了问题和解决方案。尽管我之前尝试过完全删除该目录,但目录中仍保留了一个隐藏文件(rm -rf
)。
该文件.fuse_hidden
是由文件系统创建的,因为 SFTP 服务器会话仍保留指向该文件的链接。(我之前曾通过 mobaxterm 打开过该目录中的一个文件)。
关闭打开该文件的 mobaxterm 终端上的会话,导致隐藏文件被删除,然后其他一切都正常。请注意,关闭我远程打开的文件不足以解决问题。
看这里更好的解释