¿Cuál es el verdadero punto de la opción -f en rm?

14

Al leer la página de manual de GNU coreutils rm, una de las opciones es -f, que de acuerdo con el manual,

-f, --force
          ignore nonexistent files and arguments, never prompt

Ahora, hice algunas pruebas y demuestro que si uso algo como

rm -f /nonexisting/directory/

No se quejará.

¿Qué puede alguien realmente ganar con tal opción?

Además, los ejemplos más comunes de "eliminar directorios" usando rmson algo como

 rm -rf /delete/this/dir

La -ropción tiene sentido, pero -f?

saliarosaurus
fuente

Respuestas:

9

Me parece que la página de manual carece de un pequeño detalle en este caso. La -fopción de rmrealmente tiene bastantes casos de uso:

  • Para evitar un código de salida de error
  • Para evitar que se le solicite
  • Para evitar las verificaciones de permisos

Tiene razón en que no tiene sentido eliminar un archivo inexistente, pero en los scripts es realmente conveniente poder decir "No quiero estos archivos, elimínelos si los encuentra, pero no me moleste si no lo hacen. no existe ". Algunas personas usan el set -een su script para que se detenga ante cualquier error (para evitar cualquier daño adicional que pueda causar el script), y rm -rf /home/my/garbagees más fácil que if [[ -f /home/my/garbage ]]; then rm -r /home/my/garbage; fi.

Una nota sobre las comprobaciones de permisos: para eliminar un archivo, necesita permiso de escritura en el directorio principal , no en el archivo en sí. Entonces, digamos que de alguna manera hay un archivo propiedad de rootsu directorio de inicio y no tiene sudoacceso, aún puede eliminar el archivo usando la -fopción. Si usa Git, puede ver que Git no deja el permiso de escritura en los archivos de objetos que crea:

-r--r--r-- 1 phunehehe phunehehe 62 Aug 31 15:08 testdir/.git/objects/7e/70e8a2a874283163c63d61900b8ba173e5a83c

Entonces, si usa rm, la única forma de eliminar un repositorio de Git sin usar rootes usar rm -rf.

phunehehe
fuente
44
-fno evita un código de salida de error. Si rmintenta y no elimina un archivo existente, devolverá un código de error.
Gilles 'SO- deja de ser malo'
He rechazado esta respuesta porque "Para evitar un código de salida de error" debe escribirse como "Para evitar un código de salida de error en caso de que no haya operandos de archivo o que no existan operandos de archivo". Como esta respuesta está escrita ahora, está mal.
Harold Fischer el
6

La -fopción suprime los mensajes de confirmación al eliminar un archivo de solo lectura. También suprime errores cuando uno o más archivos suministrados no existen.

La -fopción es útil cuando sabe que algunos de los archivos que está eliminando pueden ser de solo lectura y no desea que se le pregunte al respecto.

La fopción también es útil cuando desea eliminar algunos archivos en caso de que existan, y no quiere importar si existen o no. Esto se usa muy comúnmente en los archivos MAKE , para crear un comando que elimine los archivos que pueden regenerarse a partir de los archivos de origen. Por ejemplo, si foo.opuede reconstruirse desde foo.c, bar.opuede reconstruirse desde bar.cy myapppuede reconstruirse desde foo.oy bar.o, entonces, el destino del archivo MAKE

clean:
        rm -f *.o myapp

elimina myapp, foo.oy bar.osi existen y no se queja si alguno de ellos no existe.

Incluir -fen las instrucciones para eliminar un árbol de directorios no es necesario en la mayoría de los casos. Puede justificarse porque si está seguro de que desea eliminar ese árbol de directorios independientemente de lo que contenga, puede especificar -fpara evitar que se le solicite en caso de que algunos archivos sean de solo lectura. Sin embargo, las personas que dicen a plazo rm -rfson a menudo simplemente la repetición de un encantamiento místico para deshacerse de algo, independientemente de si las opciones -ry -fson realmente necesarias. Si las opciones no son necesarias, no son recomendables, porque aumentan el riesgo de que un error tipográfico en el argumento destruya algo importante.

Gilles 'SO- deja de ser malvado'
fuente
3

El -icambio arm

Generalmente veo que -fse usa rmcuando el rmcomando tiene un alias para que incluya el -iinterruptor para interactivo. El -finterruptor contrarresta el -i.

Ejemplo

Simular el problema con rmser alias a rm -i.

$ alias rm='rm -i'

Haz algunos datos falsos

$ touch afile

Ahora intente eliminarlo utilizando la versión de alias de rm

$ rm afile 
rm: remove regular empty file `afile'?

Ahora intenta usar -f

$ rm -f afile 
$

Permisos

También creo que hay casos en los que tiene acceso de solo lectura a un directorio y cuando intenta eliminar los archivos y / o subdirectorios en dicho directorio, se le cuestionará con un mensaje similar de "¿está seguro?". El uso de -fse deshace de tener que decir que sí.

slm
fuente
Al usar el alias tiene cierto sentido. Y su respuesta coincide con lo que acabo de mostrar en las páginas de manual de openbsd. Aunque openbsd no es GNU / Linux, parece que describe lo que acabas de decir. Aquí está el enlace si alguien quisiera verificar: [link] openbsd.org/cgi-bin/…
saliarosaurus
Con bash siempre puedes \rmejecutar sin alias (\ ser un acceso directo a la commandcompilación). Creo que el mejor uso -fes en el script de shell donde tiene algo como un archivo de bloqueo que puede existir o no, -fdetiene la rm: cannot remove 'file': No such file or directoryadvertencia.
Drav Sloan el
@DravSloan Sí, eso también tiene sentido. Gracias por sus respuestas tanto Drav Sloan como slm
saliarosaurus
Yo uso a rm -fmenudo en el cleanobjetivo en Makefiles
Alex
-ino es realmente de lo que -fse trata, es más un caso marginal.
Gilles 'SO- deja de ser malo'