Al mover un directorio a otro directorio, ¿existe una manera sencilla de generar una falla cuando el directorio de destino no existe?

Al mover un directorio a otro directorio, ¿existe una manera sencilla de generar una falla cuando el directorio de destino no existe?

Tenía la costumbre de usarlo mv directory1 directory2/pensando que si escribía mal el nombre directory2fallaría y me advertiría que el directorio no existía. Resulta que ese no es el caso.

¿Existe una forma sencilla de lograr esto? (Un error cuando el directorio de destino no existe).

Respuesta1

mv -t directory2/ directory1

Deman 1 mv:

mv [OPTION]... -t DIRECTORY SOURCE...

-t, --target-directory=DIRECTORY
mueva todos SOURCElos argumentos aDIRECTORY

Sin embargo, POSIX no requiere esta opción. Puede mvque lo apoyes o no.


Ejemplo:

$ ls
$ # Nothing here so far
$ mkdir foo bar
$ # Let's move foo to bar/
$ mv -t baz/ foo   # Oops, a typo, with -t
mv: failed to access 'baz/': No such file or directory
$ mv foo baz/      # Oops, a typo, without -t
$ ls                        
bar  baz
$ 

Respuesta2

Si está utilizando bashy su mvcomando no admite la -topción que no es POSIX, aún puede definir una función mvdiren su .bashrcarchivo como esta:

mvdir() {
    if [ -d "$2" ]
    then
        mv "$1" "$2"
    else
        printf 'mvdir: "%s" does not exist, or is not a directory\n' "$2" >&2
        return 1
    fi
}

Con esa definición de función implementada, puedes decir:

mvdir directory1 directory2

En una forma más compacta, el comando central de esta función es:

( [ -d directory2 ] && mv directory1 directory2 )

Esa lógica se expande ligeramente en la función para que sea más claro presentar un mensaje de error en el caso de que el directorio2 no exista o no sea un directorio. Si el directorio de destino existe, mvse ejecutará y cualquier mensaje de error o código de resultado será generado por mv. Si el directorio no existe, printfse escribirá un diagnóstico stderry la función devolverá un código de resultado distinto de cero para indicar un error.

Para probar, comience en un directorio vacío:

$ find *
find: *: No such file or directory
$ mkdir A
$ find *
A
$ mvdir A B || echo fail
mvdir: "B" does not exist, or is not a directory
fail
$ mkdir B
$ find *
A
B
$ mvdir A B || echo fail
$ find *
B
B/A

información relacionada