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

时间:2013-01-24 08:30:32

标签: linux shell mkdir

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

  

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

这真是令人费解,因为我认为-p的合同在目录已存在时总是成功。它适用于我尝试的其他系统。

所有这些系统上都有一个用户testdirectory=/home/test/tmp

4 个答案:

答案 0 :(得分:33)

如果目录中已存在同名的文件,则可能会导致这种情况。

编辑:请注意,目录不能同时包含linux机器上同名的文件和文件夹。

答案 1 :(得分:5)

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

您的目录是否偶然安装了基于FUSE的网络?

除了具有该名称的文件(其他答案)之外,当曾经在该目录中装载了某些东西的 FUSE进程崩溃(或例如,用kill -9或通过Linux OOM杀手杀掉。

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


我认为在这种情况下发出的错误消息是mkdir -p(特别是gnulib库)中的错误:

当您在安装了FUSE进程但崩溃的目录上运行它时,它说

mkdir: cannot create directory ‘/mymount’: File exists

这是非常不准确的,因为the underlying stat()调用返回ENOTCONN (Transport endpoint is not connected);但是mkdirthe previous mkdir() sycall传播了不太明确的错误。 这特别令人困惑,因为手册页上写着:

   -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