Linux 当目录存在时,mkdir-p失败

Linux 当目录存在时,mkdir-p失败,linux,shell,mkdir,Linux,Shell,Mkdir,在我们的一个远程系统上,当目录存在时,mkdir-p$directory会失败。这意味着它显示了 mkdir:无法创建目录“$directory”:文件存在 这真是令人费解,因为我相信-p的契约在目录已经存在时总是成功的。我试过的其他系统也能用 所有这些系统上都有一个用户test,并且目录=/home/test/tmp如果目录中已经有一个同名的文件,则可能会导致此问题 请注意,在linux计算机上,目录不能同时包含同名的文件和文件夹。检查是否存在与$directory同名的文件(而不是目录)。如

在我们的一个远程系统上,当目录存在时,
mkdir-p$directory
会失败。这意味着它显示了

mkdir:无法创建目录“$directory”:文件存在

这真是令人费解,因为我相信
-p
的契约在目录已经存在时总是成功的。我试过的其他系统也能用


所有这些系统上都有一个用户
test
,并且
目录=/home/test/tmp

如果目录中已经有一个同名的文件,则可能会导致此问题


请注意,在linux计算机上,目录不能同时包含同名的文件和文件夹。

检查是否存在与$directory同名的文件(而不是目录)。

如果同一目录中存在同名的文件,则mkdir-p不会创建目录。否则它将按预期工作。

您的目录是基于网络挂载的吗

除了已经存在同名的文件(其他答案)之外,当曾经在此目录中挂载某个内容的FUSE进程崩溃时(或被杀死,例如使用
kill-9
或通过Linux OOM killer)也会发生这种情况

要查看发生的详细情况,请运行
strace-fy mkdir-p$directory
,其中显示所有涉及的系统调用及其返回值


我认为在这种情况下发出的错误消息在代码> MKDIR-P<代码>(特别是<代码> GNULIB < /代码>库):

当你在一个安装了FUSE进程的dir上运行它时,这个进程崩溃了

mkdir: cannot create directory ‘/mymount’: File exists
这是非常不准确的,因为调用返回
ENOTCONN(传输端点未连接)
;但是
mkdir
会向上传播不太具体的错误。 因为手册页上说:

   -p, --parents
          no error if existing, make parent directories as needed
因此,如果dir存在,它就不会出错,但是
ls-l/
显示:

d????????? ? ?    ?       ?            ? files
所以根据这个(
d
),它是一个目录,但它不是根据
test-d


我相信更好的错误消息(在这种情况下,
mkdir-p
应该发出)是:

mkdir: cannot create directory ‘/mymount’: Transport endpoint is not connected

这正是过去的情况,我目前正在审查和修改我们的脚本。在我的例子中,它失败了,因为有一个同名的sym链接。