¿Cuál es el punto de mv -f?

34

El manual de GNU Coreutilsmv dice:

-f --force Do not prompt the user before removing a destination file.

Sin embargo, este ya parece ser el comportamiento predeterminado, por mvlo que la -fopción parece ser superflua. Por ejemplo, en GNU Bash versión 4.3.11:

$ ls -l
total 0
$ touch 1 2; mv -f 1 2; ls
2
$ touch 1 2; mv 1 2; ls
2

Parece poco probable que la intención de la -fbandera sea anular alias mv="mv -i", porque hay varias formas estándar de anular un alias (por ejemplo, usar \mv) que haría esto de manera más concisa y de una manera que sea coherente en todos los comandos.

El manual señala que, "si especifica más de una de las opciones -i, -f, -n, solo la última tendrá efecto", pero aún parece poco probable que la intención de la -fbandera sea anular la -ibandera en general, porque se puede lograr un comportamiento equivalente simplemente usando mv, que es mucho más conciso y comprensible que usar mv -if.

Siendo ese el caso, ¿cuál es el propósito de la -fbandera? ¿Por qué existe?

sampablokuper
fuente
66
Los valores predeterminados son un asunto complicado. Tome una herramienta como mount, por ejemplo (aunque hay mejores ejemplos). ¿Realmente desea recordar cuáles son los valores predeterminados para cada opción, de modo que pueda determinar qué opciones necesita establecer? Es BUENO tener opciones tanto para el valor predeterminado como para el no predeterminado, por lo que puede establecer explícitamente la opción en lugar de tener que realizar un seguimiento mental de cuál es el valor predeterminado. Algo allí es más fácil de recordar que algo que no está allí .
Comodín
El comportamiento equivalente no se puede usar si MV se convierte en mv-i
PlasmaHH
1
OMI, también es bueno para usar en scripts, porque estás siendo explícito. Comunica la intención un poco mejor.
Blacklight Shining

Respuestas:

41

El uso de -fse describe más claramente en la página de manual de 4BSD, que fue donde se agregaron las opciones -fy -i:

Si el archivo2 ya existe, se elimina antes de mover el archivo1 . Si el archivo 2 tiene un modo que prohíbe la escritura, mv imprime el modo y lee la entrada estándar para obtener una línea; si la línea comienza con y, el movimiento tiene lugar; si no, mv sale.

Opciones:

-isignifica modo interactivo. Cada vez que un movimiento es para reemplazar un archivo existente, el nombre del archivo le solicita al usuario seguido de un signo de interrogación. Si responde con una línea que comienza con 'y', el movimiento continúa. Cualquier otra respuesta evita que ocurra el movimiento.

-fsignifica fuerza. Esta opción anula las restricciones de modo o el -icambio.

Una definición aún más precisa de cómo funciona mv se da en el estándar POSIX , que agrega que -fsolo se anula -isi ocurre más adelante en la línea de comando.

Entonces, el comportamiento predeterminado es un poco diferente de -f. El valor predeterminado es solicitar confirmación solo cuando el destino no se puede escribir. (Este comportamiento se remonta al menos hasta V4 , donde mvno tomó ninguna opción). Si -ise da la opción, mv solicitará confirmación cada vez que exista el objetivo. La -fopción inhibirá preguntar en ambos casos (si ocurre después de cualquiera -i).

Mark Plotnick
fuente
Gran respuesta, gracias! Nota: algunos sistemas de archivos (p. Ej., CIFS) pueden hacer que mv muestre un comportamiento inesperado (es decir, diferente al manual), como actuar como si la -fbandera se hubiera utilizado incluso si no se hubiera utilizado .
sampablokuper
Vale la pena señalar que muchas implementaciones solo piden confirmación si parecen estar en un terminal interactivo ( isatty(0)). Además, si bien es cierto que una -fanulación posterior -i, podría no significar que esto es lo mismo que no se dan argumentos.
phk
15

Es útil cuando se establece la ejecución de mvun valor predeterminado correcto:

alias mv="mv -i"

Cuando quieras forzar un movimiento, esto funcionará:

mv -f

Como es la última opción en el comando expandido que cuenta:

mv -i -f

Este punto también se menciona en el manual GNU Coreutils .

Alejandro
fuente
1
Gracias, pero por razones que ahora he agregado a la pregunta, parece poco probable que anular alias mv="mv -i"sea ​​la razón de la existencia de -f.
sampablokuper
12
Me opongo a llamar el comportamiento predeterminado de "haz lo que te piden, sin preguntas tontas" mv(1)(y otros comandos de Unix) como "insano" como
insinúas
1
vonbrand, aunque aprecio la respuesta directa de los comandos de Linux / UNIX sin ellos -i, creo que cualquiera que haya usado la línea de comandos durante más de unos pocos años ha sido quemado mv, en un momento u otro.
Alexander
1
Puede pensar que anular -i es poco probable, pero es exactamente por eso que supongo que -f se usa así.
Walter
11

Existe porque ( man mv)

Si especifica más de uno de -i, -f, -n, sólo el final se lleva a efecto.

Por lo tanto, puede tener un script / alias / función que siempre pregunta, pero aún puede anular la opción.

# alias
alias mv='mv -i'

# function
MV () { mv -i "$@" ; }

# script
#!/bin/bash
mv -i "$@"

Una función / script significativo haría algo más, por supuesto (por ejemplo, registrar la acción).

choroba
fuente
@choroba Gracias, pero por razones que ahora he agregado a la pregunta, parece poco probable que anular los alias como alias mv="mv -i"es la razón de la existencia de -f. Sin embargo, también mencionas scripts y funciones. ¿Podría dar ejemplos usando estos dos?
sampablokuper
@sampablokuper: actualizado.
choroba
@ Choroba, gracias de nuevo. Lamentablemente, ni su ejemplo de función ni su ejemplo de script utilizan mv -f, por lo que todavía no me queda claro cómo justifican / explican su existencia. Lo siento si me estoy perdiendo lo obvio!
sampablokuper
@sampablokuper: Todos usan mv -i. Si desea usarlos pero omite la interacción, usaría MV -fetc.
choroba
1
@sampablokuper El comportamiento de mvsin ninguna de esas opciones es a veces preguntar (objetivo no escribible e terminal interactivo), por lo que esta sería una clara diferencia entre mv -fy \mv.
phk
5

El mvcomando por sí solo puede funcionar de manera diferente con la -fopción, ya que intentará sobrescribir los archivos protegidos contra escritura sin una solicitud.

user2@host:location> ls -l ./
drwxrwxr-x 2 user1 users    10   Oct 16 12:58 dir
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user1 users     0   Oct 16 12:58 file1
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file2
user2@host:location> \mv ./dir/file2 ./dir/file1
'mv' try to overwrite './dir/file1', overridding mode 0644 (rw-r--r--)? n
user2@host:location> \mv -f ./dir/file2 ./dir/file1
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file1

Debido a los permisos de escritura en el directorio, user2 puede sobrescribir los archivos de user1 ./dir/, pero se le advertirá antes de hacerlo. -fevita la advertencia.

Centimane
fuente
-1

En la programación de shell, el uso de -f es un idioma común que se utiliza para asegurarse de que sus comandos no se cancelen con errores o solicite al script / usuario una respuesta interactiva al ejecutar ciertos comandos. Lo último que desea es que su script se detenga esperando la entrada del usuario, o quizás peor, para que el comando incorrecto tome la entrada del estándar.

Nota: deshacer un alias puede causar / eliminar efectos secundarios. Si ha aliasado el comando a otra versión o con opciones adicionales, deshacer el alias causará efectos secundarios no deseados. Por ejemplo, puede tener un alias configurado con mv y rm para usar una lata de reciclaje (u otros sistemas de protección / seguimiento). Deshacer el alias romperá esto ...

Walter
fuente
Nitpick: la -fopción para cp o mv no garantiza que "funcionen". Por ejemplo, si el permiso es insuficiente, el comando -f no lo hará funcionar. Lo que querías decir es que -f fuerza una sobrescritura sin solicitud. El indicador opuesto -i significa que se requiere interactiva al sobrescribir.
Eric Leschinski
Dos cosas a tener en cuenta: 1.) Las implementaciones normalmente evaluarían si está incluso en una terminal interactiva ( isatty(0)), por lo que, por ejemplo, si su script se ejecuta como parte de una tubería, no se activará. 2.) Agregar -fno es lo mismo que deshacer -iporque mv -i -fdifiere de mv, ver la respuesta de Mark .
phk