【问题标题】:mkdir -p fails when directory exists目录存在时 mkdir -p 失败
【发布时间】:2013-01-07 22:43:03
【问题描述】:

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

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

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

在所有这些系统上都有一个用户test,还有directory=/home/test/tmp

【问题讨论】:

    标签: linux shell mkdir


    【解决方案1】:

    如果目录中已经存在同名的文件,则可能会导致此问题。

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

    【讨论】:

    • 就是这样,我目前正在审查和修复我们的脚本
    • 谢谢。就我而言,它失败了,因为有一个同名的符号链接。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您的目录是否是基于 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);但是mkdir 会从the 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-08
          • 2014-11-19
          • 2011-07-08
          • 2020-02-03
          • 2016-02-23
          • 2013-02-07
          • 2012-09-24
          相关资源
          最近更新 更多