cp -av 目录加倍

cp -av 目录加倍
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

  1. 如果c不存在(并且b存在),它将被解释为的副本的名称a,因此您将以 结束b/c

  2. 另一方面,如果确实存在并且它是一个目录,它将被解释为放置在未改变名称下的c路径,因此您将以 结束。aab/c/a

我猜一开始/home/jake/project/__workspace/scalaProjects/scalaML/src/main/scala就不存在,只有/home/jake/project/__workspace/scalaProjects/scalaML/src/main/

你的第一个命令创建了scalaacting as (1)。这可能有点令人困惑,因为你scalaa c,因此不明显发生了一些琐碎的重命名(从scalascala)。然后第二个命令充当 (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 终端上的会话,导致隐藏文件被删除,然后其他一切都正常。请注意,关闭我远程打开的文件不足以解决问题。

这里更好的解释

相关内容