Tengo un nombre de directorio foo
ubicado en ~/Desktop
. Supongamos que quiero crear un directorio desde una terminal con el mismo nombre y en la misma ubicación. Cuando lo intenté mkdir
me dio un error:
mkdir: cannot create directory `/home/nux/Desktop/foo': File exists
Eso tiene sentido, pero quiero reemplazarlo foo
si existe. miré a travésman mkdir
pero no hay ninguna opción que haga eso.
Entonces, ¿cómo sobrescribir foo
el directorio?
¿Por qué no mkdir
tiene una opción para hacer esto?
Respuesta1
Si su objetivo es ejecutar un comando de una línea que:
- Elimina y vuelve a crear el directorio
~/Desktop/foo
si ya existe. - Simplemente crea el directorio
~/Desktop/foo
si aún no existe.
Entonces puedes usar:
rm -r ~/Desktop/foo; mkdir ~/Desktop/foo
;
es equivalente a una nueva línea, pero le permite ejecutar múltiples comandos en una sola línea (es decir, como un "único comando").
- Si el directorio que está eliminando puede contener archivos de solo lectura, necesitará la
-f
marca para eliminarlos sin avisar al usuario de forma interactiva. Esto está bien, pero recomiendo tener especial cuidado conrm -rf ...
. Verman rm
para detalles. - Necesitas el
rm
comando parafinalizarantes de que se ejecute elmkdir
comando; esta es la razón para usar;
en lugar de&
. (Un comando anterior&
se ejecuta de forma asincrónica en segundo plano). - Necesita que el
mkdir
comando se ejecute cuando elrm
comando tenga éxito; esta es la razón para usar;
en lugar de||
. - Necesita que el
mkdir
comando se ejecute cuando elrm
comando falla (por lo general, una falla significará que el directorio aún no existía); esta es la razón para usar;
en lugar de&&
. - El
rm
comando puede fallar incluso cuando el directorio ya existe, en cuyo caso elmkdir
comando también fallará, pero los mensajes de error tendrán sentido y probablemente no sea necesario agregar un paso intermedio para verificar lafoo
existencia de antes de intentar crearlo.
Ver3.2.3 Listas de comandosen elManual de referencia de bashpara obtener más información y explicaciones sobre los operadores ;
, &
, ||
y &&
.
Comomuru sugirió(yRinzwind elaboró),Te recomiendo que investiguesrsync
para ver si cubrirá sus necesidades de respaldo. Hay algunas guías útiles adicionales sobre elpágina de documentación de rsync, así comoesta guía de rsync de Ubuntu.
¿Por qué mkdir no tiene esta opción?
mkdir
crea directorios (el "mk"significa "hacer"). Porque también eliminar directorios de forma recursiva y todos los archivos que contienen sería malo, porque violaría laprincipio del menor asombrode una manera que probablemente provocaría la pérdida de datos.
rmdir
ni siquiera elimina directorios que contienen archivos (que no son de directorio).rm
tiene una -r
opción, lo cual tiene sentido ya que rm
se espera que elimine archivos (ese es su propósito, por lo que el peligro inherente es intuitivo y los usuarios normalmente saben que deben tener cuidado al ejecutar rm
comandos).
Respuesta2
No, no existe un comando único para hacer lo que estás pidiendo.
¿Por qué?
Ésta es la filosofía de Unix: escribir programas que hagan una cosa y la hagan bien. Escribir programas para trabajar juntos. 1
En este caso, los comandos mkdir
y rm
hacen lo que necesita y funcionan bien juntos, ya que rm -r
también eliminarán el directorio, por lo que un comando posterior mkdir
creará el directorio.
1El arte de la programación Unix, Eric S. Raymond, citando a Doug McIlroy.
Respuesta3
El comando para eliminar un directorio es rm
. Entonces necesitas 2 comandos.
rm -r ~/Desktop/foo/
mkdir ~/Desktop/foo/
Como se muestra en los comentarios, puede encadenarlos con ;
(= hacer ambas cosas incluso si el primero falla) o &&
(= solo mkdir cuando el rm no falla).
El -r
es para eliminar directorios. El primer comando también elimina TODO el contenido del directorio. Si esa NO es su intención, tanto rm como mkdir no son lo que está buscando: los permisos son chmod
y chown
.
¿Por qué mkdir no tiene esta opción?
Ambigüedad. mkdir
significa crear directorio. No eliminar ni crear directorio. Y dado que el rm
comando es para eliminar cosas, no es necesario rmdir
poder eliminar un directorio.
Respuesta4
Para hacerlo de la manera más limpia, uso esto:
create_clean_directory(){
dir_name=$1
if [ -d "$dir_name" ]; then
echo "Removing $dir_name"
rm -rf "$dir_name"
elif [ -f "$dir_name" ]; then
echo "File with this name already exists, not a directory."
exit
fi
if mkdir "$dir_name"; then
echo "Clean directory created: $dir_name"
return 0
else
echo "Creating directory failed: $dir_name"
return 1
fi
}
Y para usarlo:
create_clean_directory <dir_name>
Esto asegura que lo que está intentando eliminar sea un directorio y no un archivo:
-d
Compruebe si ya existe un directorio con ese nombre. si es así, bórralo.-f
Compruebe que no exista ningún archivo con este nombre. si es así, imprima el mensaje de error y salga.Cree el nuevo directorio y haga eco correctamente, o si falla, el eco falló.