Подтвердить что ты не робот

Mkdir -p не работает, когда существует каталог

В одной из наших удаленных систем mkdir -p $directory завершается сбой при наличии каталога. что означает, что он показывает

mkdir: невозможно создать каталог '$ directory': файл существует

Это действительно озадачивает, поскольку я полагал, что контракт -p был таким, который всегда выполняется, когда каталог уже существует. И он работает на других системах, которые я пробовал.

на всех этих системах есть пользователь test и directory=/home/test/tmp.

4b9b3361

Ответ 1

Это может быть вызвано, если уже есть файл с тем же именем, который находится в каталоге.

Изменить: обратите внимание, что каталог не может содержать файлы и папки с одинаковым именем на машинах Linux.

Ответ 2

Проверьте, есть ли файл (а не каталог) с именем, аналогичным $directory.

Ответ 3

mkdir -p не будет создавать каталог, если в том же каталоге существует файл с тем же именем. В противном случае он будет работать, как ожидалось.

Ответ 4

Был ли ваш каталог сетевым монтированием 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