¿Sobrescribir un directorio existente?

¿Sobrescribir un directorio existente?

Tengo un nombre de directorio fooubicado en ~/Desktop. Supongamos que quiero crear un directorio desde una terminal con el mismo nombre y en la misma ubicación. Cuando lo intenté mkdirme dio un error:

mkdir: cannot create directory `/home/nux/Desktop/foo': File exists

Eso tiene sentido, pero quiero reemplazarlo foosi existe. miré a travésman mkdirpero no hay ninguna opción que haga eso.

Entonces, ¿cómo sobrescribir fooel directorio?

¿Por qué no mkdirtiene 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/foosi ya existe.
  • Simplemente crea el directorio ~/Desktop/foosi 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 -fmarca para eliminarlos sin avisar al usuario de forma interactiva. Esto está bien, pero recomiendo tener especial cuidado con rm -rf .... Verman rmpara detalles.
  • Necesitas el rmcomando parafinalizarantes de que se ejecute el mkdircomando; 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 mkdircomando se ejecute cuando el rmcomando tenga éxito; esta es la razón para usar ;en lugar de ||.
  • Necesita que el mkdircomando se ejecute cuando el rmcomando 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 rmcomando puede fallar incluso cuando el directorio ya existe, en cuyo caso el mkdircomando también fallará, pero los mensajes de error tendrán sentido y probablemente no sea necesario agregar un paso intermedio para verificar la fooexistencia 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 investiguesrsyncpara 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?

mkdircrea 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.

rmdirni siquiera elimina directorios que contienen archivos (que no son de directorio).rmtiene una -ropción, lo cual tiene sentido ya que rmse 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 rmcomandos).

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 mkdiry rmhacen lo que necesita y funcionan bien juntos, ya que rm -rtambién eliminarán el directorio, por lo que un comando posterior mkdircreará 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 -res 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 chmody chown.

¿Por qué mkdir no tiene esta opción?

Ambigüedad. mkdirsignifica crear directorio. No eliminar ni crear directorio. Y dado que el rmcomando es para eliminar cosas, no es necesario rmdirpoder 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:

  1. -dCompruebe si ya existe un directorio con ese nombre. si es así, bórralo.

  2. -fCompruebe que no exista ningún archivo con este nombre. si es así, imprima el mensaje de error y salga.

  3. Cree el nuevo directorio y haga eco correctamente, o si falla, el eco falló.

información relacionada