在我们的一个远程系统上,当目录已经存在时,mkdir -p $directory
命令会失败,显示如下信息:
mkdir: cannot create directory '$directory': file exists
这真的很令人困惑,因为我认为-p
的合同是,它总是成功,即使目录已经存在。而且,在我尝试过的其他系统上也可以运行。
所有这些系统上都有一个用户test
,并且directory=/home/test/tmp
。
如果目录中已经存在同名的文件,那么就会导致这种情况发生。
请注意,在Linux机器上,一个目录不能同时包含同名的文件和文件夹。
检查是否存在与$directory同名的文件(而非目录)。
如果在同一目录下存在同名文件,则mkdir -p不会创建目录。否则,它将按预期工作。
你的目录是否是基于FUSE网络挂载?
除了已经存在该名称的文件(其他答案),这种情况可能发生在曾经挂载过某些内容的FUSE进程崩溃(或被杀死,例如使用kill -9
或通过Linux OOM killer)的目录上。
在mount
中检查FUSE挂载是否仍然列在其中。如果是,则应该能够卸载它并使用fusermount -uz
修复情况。
要详细了解发生了什么,请运行strace -fy mkdir -p $directory
,它会显示所有涉及的系统调用及其返回值。
mkdir -p
(特别是gnulib
库)中的一个错误:
当你在已经挂载了FUSE进程但该进程崩溃的目录上运行它时,它会显示以下信息:
mkdir: cannot create directory ‘/mymount’: File exists
stat()
调用返回ENOTCONN(传输端点未连接)
;但mkdir
将来自前一个mkdir()
系统调用的不太具体的错误向上传播。
这更加令人困惑,因为手册上说: -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
mount
中检查 FUSE 挂载是否仍然存在。如果是,则可以使用 fusermount -uz
卸载它并修复问题。我已经将此添加到答案中了。 - nh2sudo mv -p -p/renaming
mkdir -p
ls -lad -p
chmod u+w -p
ls -lad -p
你会看到 用户现在有写入权限
现在,你可以创建目录
mkdir -p