移动当前目录时,我得到“mv:无法移动‘。’到“../dir/.”:设备或资源繁忙”

移动当前目录时,我得到“mv:无法移动‘。’到“../dir/.”:设备或资源繁忙”
$ mv . ../general/
mv: cannot move `.' to `../general/.': Device or resource busy

这是否意味着当前目录是繁忙的设备或资源,并且无法移走?为什么?

答案1

您无法移动当前所在的目录。当前进程正在使其保持忙碌状态。

相反,请上一级并命名先前的当前目录以将其移动到目标。

答案2

移动一个点是不可能的.。该点与当前目录名称不同。您可以将其视为.指向目录的指针,但不是目录本身,因此,

$ pwd && echo $PWD && realpath .
/home/jimmij/tmp
/home/jimmij/tmp
/home/jimmij/tmp
$ mkdir tmp1 tmp2
$ mv tmp1/. tmp2/
mv: cannot move ‘tmp1/.’ to ‘tmp2/.’: Device or resource busy

不起作用,但是

cd tmp1
mv ../tmp1 ../tmp2

工作正常,所以实际上你移动当前目录,尽管此操作后某些命令可能会混淆:

$ pwd && echo $PWD && realpath .
/home/jimmij/tmp/tmp1
/home/jimmij/tmp/tmp1
/home/jimmij/tmp/tmp2/tmp1
$ cd .
$ pwd && echo $PWD && realpath .
/home/jimmij/tmp/tmp2/tmp1
/home/jimmij/tmp/tmp2/tmp1
/home/jimmij/tmp/tmp2/tmp1

类似的故事..,即父目录。

换句话说,每个目录必须至少包含两个元素:...。您无法移动或删除它们。

答案3

您收到该消息的原因:

mv:无法移动.' to../general/。':设备或资源繁忙

是由于怎样的.,以及..工作之外的mv。当您在 Unix 中移动某些内容时,该mv命令会尝试取消链接所有引用您尝试移动的项目的 inode 的链接。在这种情况下,这将是所引用的目录的.索引节点。

“符号/链接”...链接到索引节点,并且在某种意义上是特殊的。您可以在 U&L 问答中了解他们的历史,标题为:为什么新目录在添加任何内容之前其硬链接计数为 2?如果您曾经查看过新创建的目录,您会注意到它总是以链接计数 2 开头。原因是由于 和 的.存在..

$ mkdir adir

$ ls -l | grep adir
drwxrwxr-x. 2 saml saml 4096 Oct  5 08:02 adir

$ ls -la adir/
total 8
drwxrwxr-x. 2 saml saml 4096 Oct  5 08:02 .
drwxrwxr-x. 3 saml saml 4096 Oct  5 08:02 ..

笔记:ls如果您不清楚,请参阅此 U&L 问答中的输出参考,标题为:ls -al 输出中的字段是什么意思?

因此它们不是实际目录的名称,而是链接到它们的“符号/链接”。因此,在能够之前必须先断开它们的链接mv

好吧,由于您的命令正在使用.,因此该命令无法取消链接mv,因此消息:“设备或资源繁忙”。

参考

答案4

Linux 禁止重命名以组件.或结尾的任何路径..,返回错误 EBUSY;以下也会失败:

$ mkdir a a/aa
$ mv a/aa/.. b
mv: cannot move ‘a/aa/..’ to ‘b/..’: Device or resource busy

其代码位于namei.c::renameat.当传递给各种函数时,路径名的最后一个组成部分必须是 类型LAST_NORM,而不是LAST_DOTLAST_DOTDOT

FreeBSD 在每种情况下都会返回错误 EINVAL。


我们只能猜测为什么会有这个限制。

如果出现以下情况,则 rename() 函数将失败:
...
[EBUSY] 由旧或新命名的目录当前正在由系统或其他进程使用,并且实现认为这是一个错误。

人们可以考虑.当前正在被该进程使用。但请注意,Linux 允许以下操作,因此目录仅被某个进程使用并不足以导致rename失败:

$ mkdir /tmp/t
$ cd /tmp/t
$ mv /tmp/t /tmp/t1
$ /bin/pwd
/tmp/t1

.禁止重命名和 的原因..可能是“减少用户的困惑”。

  • .通常是指向其父目录中目录条目的硬链接,并且有些特殊,因为进程始终可以打开.以访问其当前工作目录。能够重命名它会适得其反。
  • ..通常是到目录父目录的硬链接,并且有些特殊,因为打开的进程..将获取父目录(或目录本身,如果它是安装点)。能够重命名它会适得其反。

Linux 还禁止最后一个组件为(ENOTEMPTY) 或(EINVAL)rmdir的路径。 FreeBSD 对其中每一个都返回错误 EINVAL。这...rmdir 的 POSIX 标准有这个:

如果出现以下情况,rmdir() 函数将失败:
...
[EINVAL] 路径参数包含最后一个组成部分,即点。

相关内容