目录存在时 mkdir -p 失败

新手上路,请多包涵

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

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

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

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

原文由 UmNyobe 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

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

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

原文由 Ryan Tse 发布,翻译遵循 CC BY-SA 4.0 许可协议

您的目录是否是基于 FUSE 的网络挂载?

除了 具有该名称的文件已经存在(其他答案)之外,当 曾经在此目录中安装某些内容的 FUSE 进程崩溃(或被杀死,例如使用 kill -9 或通过 Linux OOM 杀手)时,可能会发生这种情况)。

检查 mount 如果 FUSE 安装仍然在那里列出。如果是,您应该能够卸载它并使用 fusermount -uz 修复这种情况。

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


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

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

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

这是相当不准确的,因为 底层 stat() 调用返回 ENOTCONN (Transport endpoint is not connected) ;但是 mkdir 向上传播 前一个 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

原文由 nh2 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题