在我们的一个远程系统上 mkdir -p $directory
目录存在时失败。这意味着它显示
mkdir: 无法创建目录 ‘$directory’ : 文件存在
这真的很令人费解,因为我相信 -p
的合同在目录已经存在时总是成功的。它适用于我尝试过的其他系统。
在所有这些系统上都有一个用户 test
和 directory=/home/test/tmp
。
原文由 UmNyobe 发布,翻译遵循 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 许可协议
7 回答5.3k 阅读
4 回答4k 阅读
2 回答5.9k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
2 回答3.2k 阅读
1 回答3.6k 阅读
如果目录中已经存在同名 文件,则可能会导致此问题。
请注意,在 Linux 机器上,一个目录不能同时包含同名的文件和文件夹。