¿Cómo evitar que rm informe que no se encontró un archivo?

155

Estoy usando rmdentro de un script BASH para eliminar muchos archivos. A veces los archivos no están presentes, por lo que informa muchos errores. No necesito este mensaje He buscado en la página del manual un comando para rmsilenciarlo, pero la única opción que encontré es -fque, según la descripción, "ignorar archivos inexistentes, nunca preguntar", parece ser la opción correcta, pero el nombre no parece encajar , así que me preocupa que pueda tener consecuencias no deseadas.

  • ¿Es la -fopción la forma correcta de silenciar rm? ¿Por qué no se llama -q?
  • ¿Esta opción hace algo más?
Pueblo
fuente
44
no desea usar -f, elimina el archivo que marcó como de solo lectura.
pizza

Respuestas:

209

El uso principal de -fes forzar la eliminación de archivos que no se eliminarían rmpor sí solos (como un caso especial, "elimina" archivos inexistentes, suprimiendo así el mensaje de error).

También puede simplemente redirigir el mensaje de error usando

$ rm file.txt 2> /dev/null

(o el equivalente de su sistema operativo). Puede verificar el valor de $? inmediatamente después de llamar rmpara ver si realmente se eliminó un archivo o no.

chepner
fuente
3
--fes válido para GNU Coreutils rm, pero solo porque es una abreviatura única para --force. La forma corta -fes más clara y más portátil.
Keith Thompson,
Ni siquiera estoy seguro de darme cuenta de eso. --faquí es solo un error tipográfico para -f.
chepner
2
¿Qué hace el 2 en 2>?
Dan
@Maverick Redirige los mensajes enviados a stderr a / dev / null en lugar de enviarlos al terminal.
Benjamin Nolan
73

Sí, -fes la opción más adecuada para esto.

Satya
fuente
Algunos sistemas le avisarán cuando haya espacio incluso con -f hasta que use la barra invertida.
vimdude
11
@ vimdude: No son "algunos sistemas"; que el comportamiento indica que tiene una función de shell o alias que se asigna rma rm -i.
Keith Thompson
28

-f es el indicador correcto, pero para el operador de prueba, no rm

[ -f "$THEFILE" ] && rm "$THEFILE"

esto asegura que el archivo existe y es un archivo normal (no un directorio, nodo de dispositivo, etc.)

technosaurus
fuente
44
Sin embargo, esto tiene una condición de carrera y no debe usarse en scripts de producción.
tripleee
Creo que lo que señala @tripleee es que la prueba "-f" y la eliminación del archivo podrían completarse en cualquier orden. Otra forma de hacerlo es:, lo if [ -f "$THEFILE" ]; then rm "$THEFILE"; fique hace que la prueba y los pasos de eliminación de archivos sean secuencialmente explícitos.
robla
2
@robla ese código hace exactamente lo mismo con una sintaxis más detallada ... &&! = & ... La prueba siempre sucederá antes de rm pero técnicamente un proceso separado podría (aunque es muy poco probable) eliminarlo antes de que rm se ejecute (mientras el shell código después de que se está interpretando la prueba).
technosaurus
Technosaurus - Uy, tienes razón. ¿Cuál crees que es la mejor respuesta a la pregunta de @ mmlac?
robla
3
Y solo para confirmar, la condición de la carrera es que algo podría eliminar el archivo entre testy rm. No hay forma de rmejecutar antes testaquí. Mirar antes de saltar es un error común en la programación concurrente: ya no puedes confiar en el resultado de la "mirada" cuando realmente "saltas"; la solución a eso es usar operaciones de bloqueo o atómicas. Que es precisamente por lo que quieres rm -f, que es un ejemplo de esto último.
tripleee el
13

\rm -f file nunca informará no encontrado.

vimdude
fuente
44
El -r es innecesario y peligroso.
mahemoff
1
Asumí muchos archivos o directorios. Vuelva a leer la solicitud del usuario y tiene razón, solo estaba pidiendo archivos. Así que corrigió mi respuesta
vimdude
¿Cuál es la barra invertida antes de que la empresa haga? por favor chicos, necesito una respuesta para eso. En Windows, la versión 4.1 de make de cygwin no puede manejar \ rm mientras que 3.75 funciona bien.
Ayman Salah
2
@AymanSalah La barra invertida en este contexto escaparía a cualquier función o alias que envolviera lo real rm(como era popular en algunos sitios a principios de la década de 1990 para evitar que los principiantes eliminen cosas y luego llamen al administrador del sistema para recuperar sus archivos).
tripleee el
Gracias, esto solucionó mi problema. Aparentemente, el código de salida permite el encadenamiento usando &&sin -f se rompe una vez que no se encuentra el archivo.
Igor
5

En cuanto a rm -fhacer "cualquier otra cosa", fuerza ( -fes una forma abreviada de --force) la eliminación silenciosa en situaciones en las que de rmlo contrario le pediría confirmación. Por ejemplo, cuando intente eliminar un archivo que no pueda escribir de un directorio que pueda escribir.

Idelic
fuente
-9

Tuve el mismo problema para cshell. La única solución que tuve fue crear un archivo ficticio que coincidiera con el patrón antes de "rm" en mi script.

Niranjan
fuente
77
¿Era realmente la única solución? ¿Intentaste rm -fo rm filename >&/dev/null?
Keith Thompson,