Ответ 1
Это может быть вызвано, если уже есть файл с тем же именем, который находится в каталоге.
Изменить: обратите внимание, что каталог не может содержать файлы и папки с одинаковым именем на машинах Linux.
В одной из наших удаленных систем mkdir -p $directory
завершается сбой при наличии каталога. что означает, что он показывает
mkdir: невозможно создать каталог '$ directory': файл существует
Это действительно озадачивает, поскольку я полагал, что контракт -p
был таким, который всегда выполняется, когда каталог уже существует. И он работает на других системах, которые я пробовал.
на всех этих системах есть пользователь test
и directory=/home/test/tmp
.
Это может быть вызвано, если уже есть файл с тем же именем, который находится в каталоге.
Изменить: обратите внимание, что каталог не может содержать файлы и папки с одинаковым именем на машинах Linux.
Проверьте, есть ли файл (а не каталог) с именем, аналогичным $directory.
mkdir -p не будет создавать каталог, если в том же каталоге существует файл с тем же именем. В противном случае он будет работать, как ожидалось.
Был ли ваш каталог сетевым монтированием FUSE -based случайно?
В дополнение к файлу с таким именем уже существует (другой ответ), это может произойти, когда процесс FUSE, который когда-то монтировал что-то в этом каталоге, аварийно kill -9
(или был уничтожен, например, с помощью kill -9
или через убийцу Linux OOM).
Чтобы увидеть, что происходит в деталях, запустите 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()
. Это очень запутанно, потому что на странице руководства написано:
-p, --parents
no error if existing, make parent directories as needed
поэтому он не должен ls -l/
ошибку, если ls -l/
существует, но ls -l/
показывает:
d????????? ? ? ? ? ? files
таким образом, согласно этому (d
), это каталог, но он не соответствует test -d
.
Я считаю, что лучшим сообщением об ошибке (которое mkdir -p
должен mkdir -p
в этом случае) будет:
mkdir: cannot create directory ‘/mymount: Transport endpoint is not connected