繁体   English   中英

目录存在时 mkdir -p 失败

[英]mkdir -p fails when directory exists

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

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

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

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

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

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

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

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

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

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

如果 FUSE 安装仍然在那里列出,请检查mount 如果是,您应该能够卸载它并使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM