当目录存在时,在我们的一个远程系统上mkdir -p $directory
失败。这意味着它显示
mkdir: 无法创建目录 '$directory' : 文件存在
这真的很令人费解,因为我相信-p
当目录已经存在时,契约总是成功的。它适用于我尝试过的其他系统。
test
所有这些系统上都有一个用户,并且directory=/home/test/tmp
.
如果目录中已经存在同名文件,则可能会导致此问题。
请注意,在 Linux 机器上,一个目录不能同时包含同名的文件和文件夹。
检查是否有与 $directory 同名的文件(不是目录)。
如果同一目录中存在同名文件,则 mkdir -p 不会创建目录。否则它将按预期工作。
您的目录是否是基于FUSE的网络挂载?
除了具有该名称的文件已经存在(其他答案)之外,当曾经在此目录中安装某些内容的 FUSE 进程崩溃(或被杀死,例如使用kill -9
或通过 Linux OOM 杀手)时,可能会发生这种情况。
要详细了解发生了什么,请运行strace -fy mkdir -p $directory
,它会显示所有涉及的系统调用及其返回值。
我认为在这种情况下发出的错误消息是mkdir -p
(特别是gnulib
库)中的错误:
当您在安装了 FUSE 进程但该进程崩溃的目录上运行它时,它会说
mkdir: cannot create directory ‘/mymount’: File exists
这是相当不准确的,因为底层stat()
调用返回ENOTCONN (Transport endpoint is not connected)
;但mkdir
会传播上一个 sycall 中不太具体的mkdir()
错误。这更加令人困惑,因为手册页说:
-p, --parents
no error if existing, make parent directories as needed
因此,如果目录存在,它不应该出错,但ls -l /
显示:
d????????? ? ? ? ? ? files
所以根据这个(d
),它是一个目录,但它不是根据test -d
。
我相信更好的错误消息(mkdir -p
在这种情况下应该发出)是:
mkdir: cannot create directory ‘/mymount’: Transport endpoint is not connected