当目录存在时 mkdir -p 失败

问题描述 投票:0回答:6

在我们的远程系统之一上,当目录存在时,

mkdir -p $directory
会失败。这意味着它显示

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

这确实令人费解,因为我相信

-p
的合同是当目录已经存在时总是成功。它适用于我尝试过的其他系统。

所有这些系统上都有一个用户

test
,并且
directory=/home/test/tmp

linux shell mkdir
6个回答
53
投票

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

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


4
投票

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


4
投票

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


4
投票

您的目录是否是基于 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
    

0
投票
原因:名为-p的文件已存在。

说明: 你可能想知道,当你只创建一个目录时,文件 -p 是如何创建的。因为 Unix 中一切都是文件,甚至你创建的目录也是文件。

解决方案: 方法 1:重命名现有目录(在您的情况下为“-p”)

sudo mv -p -p/renaming
我们已将 -p 移动到新目录 -p/renaming 或者说重命名它。
现在,重新运行命令

mkdir -p
这次应该不会有错误了。

您可能遇到的另一个问题:权限被拒绝 当您没有写入权限时会出现这种情况 您可以使用

进行检查

ls -lad -p
你会看到类似这样的东西

'd' 表示这是一个目录,r-x 表示用户只有读/执行权限,但没有写权限 因此要向用户授予权限,请使用:

chmod u+w -p
现在再试一次

ls -lad -p
你会看到

用户现在有写入权限

现在,您可以创建目录了

mkdir -p
    

0
投票
我也遇到过类似的情况,目录显然不存在。我在 WSL 下使用 bash,目录是 Windows 共享。该文件夹中启动了一个后台进程。我从另一个 shell 中执行了

rm -rf

 来删除该目录,突然我的脚本停止工作。在我执行 
ps -ef
 找到在该目录中启动的进程后,我能够 
kill -9 <pid>
 然后 
mkdir
 工作了。

© www.soinside.com 2019 - 2024. All rights reserved.