linux - not - mkdir-p falla cuando existe el directorio
mkdir ubuntu (4)
¿Fue su directorio un montaje en red basado en FUSE por casualidad?
Además de un archivo con ese nombre ya existente (otra respuesta), esto puede suceder cuando un proceso FUSE que una vez montó algo en este directorio se bloqueó (o se eliminó, por ejemplo, con kill -9
o mediante el asesino OOM de Linux).
Para ver qué sucede en detalle, ejecute el strace -fy mkdir -p $directory
, que muestra todos los syscalls involucrados y sus valores de retorno.
Considero que los mensajes de error emitidos en este caso son un error en mkdir -p
(en particular la biblioteca gnulib
):
Cuando lo ejecutas en un directorio que tiene un proceso FUSE montado pero el proceso se bloquea, dice
mkdir: cannot create directory ‘/mymount’: File exists
que es bastante inexacto, porque la llamada stat()
subyacente devuelve ENOTCONN (Transport endpoint is not connected)
; pero mkdir
propaga el error menos específico del anterior mkdir()
sycall . Es extra confuso porque la página del manual dice:
-p, --parents
no error if existing, make parent directories as needed
por lo que no debería aparecer un error si el directorio existe, sin embargo, ls -l /
shows:
d????????? ? ? ? ? ? files
así que de acuerdo con esta ( d
), es un directorio, pero no está de acuerdo con la test -d
.
Creo que un mejor mensaje de error (que mkdir -p
debería emitir en este caso) sería:
mkdir: cannot create directory ‘/mymount’: Transport endpoint is not connected
En uno de nuestros sistemas remotos, el mkdir -p $directory
falla cuando el directorio existe. lo que significa que se muestra
mkdir: no se puede crear el directorio ''$ directorio'': el archivo existe
Esto es realmente desconcertante, ya que creía que el contrato de -p
era que siempre tiene éxito cuando el directorio ya existe. Y funciona en los otros sistemas que probé.
hay una test
usuario en todos estos sistemas y directory=/home/test/tmp
.
Esto podría ser causado si ya existe un archivo con el mismo nombre ubicado en el directorio.
Edición: tenga en cuenta que un directorio no puede contener un archivo y una carpeta con el mismo nombre en las máquinas Linux.
Verifique si hay un archivo (no un directorio) con el mismo nombre que $ directorio.
mkdir -p no creará el directorio si hay un archivo con el mismo nombre que existe en el mismo directorio. De lo contrario funcionará como se esperaba.