Linux 当目录存在时,mkdir-p失败
在我们的一个远程系统上,当目录存在时,Linux 当目录存在时,mkdir-p失败,linux,shell,mkdir,Linux,Shell,Mkdir,在我们的一个远程系统上,当目录存在时,mkdir-p$directory会失败。这意味着它显示了 mkdir:无法创建目录“$directory”:文件存在 这真是令人费解,因为我相信-p的契约在目录已经存在时总是成功的。我试过的其他系统也能用 所有这些系统上都有一个用户test,并且目录=/home/test/tmp如果目录中已经有一个同名的文件,则可能会导致此问题 请注意,在linux计算机上,目录不能同时包含同名的文件和文件夹。检查是否存在与$directory同名的文件(而不是目录)。如
mkdir-p$directory
会失败。这意味着它显示了
mkdir:无法创建目录“$directory”:文件存在
这真是令人费解,因为我相信-p
的契约在目录已经存在时总是成功的。我试过的其他系统也能用
所有这些系统上都有一个用户
test
,并且目录=/home/test/tmp
如果目录中已经有一个同名的文件,则可能会导致此问题
请注意,在linux计算机上,目录不能同时包含同名的文件和文件夹。检查是否存在与$directory同名的文件(而不是目录)。如果同一目录中存在同名的文件,则mkdir-p不会创建目录。否则它将按预期工作。您的目录是基于网络挂载的吗 除了已经存在同名的文件(其他答案)之外,当曾经在此目录中挂载某个内容的FUSE进程崩溃时(或被杀死,例如使用
kill-9
或通过Linux OOM killer)也会发生这种情况
要查看发生的详细情况,请运行strace-fy mkdir-p$directory
,其中显示所有涉及的系统调用及其返回值
我认为在这种情况下发出的错误消息在代码> MKDIR-P<代码>(特别是<代码> GNULIB < /代码>库):
当你在一个安装了FUSE进程的dir上运行它时,这个进程崩溃了mkdir: cannot create directory ‘/mymount’: File exists
这是非常不准确的,因为调用返回ENOTCONN(传输端点未连接)
;但是mkdir
会向上传播不太具体的错误。
因为手册页上说:
-p, --parents
no error if existing, make parent directories as needed
因此,如果dir存在,它就不会出错,但是ls-l/
显示:
d????????? ? ? ? ? ? files
所以根据这个(d
),它是一个目录,但它不是根据test-d
我相信更好的错误消息(在这种情况下,
mkdir-p
应该发出)是:
mkdir: cannot create directory ‘/mymount’: Transport endpoint is not connected
这正是过去的情况,我目前正在审查和修改我们的脚本。在我的例子中,它失败了,因为有一个同名的sym链接。