$ 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_DOT
或LAST_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] 路径参数包含最后一个组成部分,即点。