¿Rm no informa cuando falta un archivo?

39

Tengo un script bash que quiero eliminar archivos de varios directorios. Con frecuencia, no estarán allí porque no se generaron y eso está bien. ¿Hay alguna manera de hacer que el script no informe ese error, pero si rm tiene alguna otra salida para informar eso?

Alternativamente, ¿hay un mejor comando para eliminar el archivo que sea menos ruidoso?

flickerfly
fuente

Respuestas:

67

Usa la -fopción. Ignorará silenciosamente los archivos inexistentes.

De man rm:

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

[La parte "nunca solicitar" significa que (a) -fanula cualquier opción -iu -Iopción previamente especificada , y (b) los archivos protegidos contra escritura se eliminarán sin preguntar.]

Ejemplo

Sin -f, rmse quejará de los archivos faltantes:

$ rm nonesuch
rm: cannot remove ‘nonesuch’: No such file or directory

Con -f, quedará en silencio:

$ rm -f nonesuch
$
John1024
fuente
44
Oh, yo nuevo que no solicitó la eliminación, no me di cuenta de que también ignoraba a los no existentes. Me salteé totalmente eso al mirar al hombre. :-) Gracias. Marcaré esto como la respuesta tan pronto como se me permita.
flickerfly
9

Si su requisito es que rmno se queja de la falta de archivos, pero que también desea cualquier otro resultado rm, mi sugerencia sería probar primero la existencia del archivo de destino y solo llamar rm( sin la -fmarca) si el archivo realmente existe.

# rest of script
# ...
[ -e "$file" ] && rm "$file"
# ...
# rest of script

Llamar rm -fa un archivo que, por ejemplo, no tiene permisos de escritura de usuario, eliminará el archivo y tampoco emitirá el aviso normal para ese escenario.

En caso de que quiera usar la misma idea con varios archivos, crearía una definición de función, como:

qrm() {
  for f
  do
    [ -e "$f" ] && rm "$f"
  done
}

Úselo como: qrm file1 file2-does-not-exist *.txt etc here

Jeff Schaller
fuente
1
Vale la pena ser consciente de la pequeña posibilidad de una condición de carrera en la que el archivo se elimina (o se crea) entre la prueba y la eliminación, pero no puedo imaginar que eso sea relevante en una situación típica en la que uno usaría un script de shell .
David Z
7

Declaró que aún desea ver otros resultados del rmcomando cuando lo ejecuta, pero el uso de la -fopción los eliminará. Tendrá que filtrar STDERR para lo que desea, lo cual es un poco complicado, dado que desea que se muestre todo lo demás.

Deberá usar un comando como este:

rm -f filename 3>&1 1>&2 2>&3 3>&- | grep -v 'No such file or directory'

Comando explicado:

  • -f argumento es forzar y no solicitar confirmación o errores
  • 3>&1 1>&2 2>&3 3>&-es cambiar STDOUT y STDERR para filtrar (puede leer más sobre esto aquí si lo desea
  • | grep -v 'No such file or directory' está filtrando el mensaje que no quieres ver

Ahora, si solo desea suprimir por completo los mensajes de error, puede ejecutar el siguiente comando:

rm filename 2> /dev/null

Este comando redirige STDERR a / dev / null para que no lo vea cuando ejecute el comando.

BriGuy
fuente
1
(AFAICS) rmsin -vsalidas nunca a stdout, solo stderr, por lo que en este caso podrías simplemente 2>&1 | grepsin el baile que es más útil en general,
dave_thompson_085
4

Como alternativa, puede usar el findcomando con la -deleteopción. Esto (obviamente) solo eliminará los archivos que encuentre, por lo que nunca advierte si ninguno lo está. Un ejemplo podría ser:

find /var/log/triffids/ -name "*.log" -mtime 30 -delete

que buscaría en el /var/log/triffids/directorio y eliminaría todos los archivos con el .logsufijo que no se hayan modificado durante más de 30 días.

Siempre es una buena idea ejecutar estos comandos sin la -deleteopción primero, para asegurarse de que encuentre los archivos que espera.

seumasmac
fuente
Me gusta esta opción y consideraré un cambio. Gracias por compartirlo.
flickerfly
3

Marque la opción --force( -f) de rm:

-f, --force

ignore los archivos y argumentos inexistentes, nunca solicite

heemayl
fuente
2

Este es un truco, pero siempre se podría toucheliminar el archivo. Si no existe, se creará para que rmpueda eliminarlo.

matega
fuente
Me gusta esto, excepto por el rendimiento: ¿qué tan costoso es tocar varias K de archivos en lugar de eliminar solo los que no existen?
Dani_l
0

Puede usar -fcomo sea, de acuerdo con la página del manual:

Intente eliminar los archivos sin solicitar confirmación, independientemente de los permisos del archivo. Si el archivo no existe, no muestre un mensaje de diagnóstico ni modifique el estado de salida para reflejar un error. recuerde también que la opción -f anula cualquier opción -i anterior.

rm -f xyz-directory

no le pedirá nada y hará exactamente lo que quiera.

Ankit Jain
fuente
-1

Hay dos formas principales: si agrega la opción -f, no mostrará el error "no existe" y dos: (funciona para casi cualquier comando) en lugar de simplemente hacer "thecommand" do "thecommand 2> / dev / null "donde" thecommand "es el comando que estás haciendo.

John
fuente
1
Estaba evitando las tuberías porque no quiero perder otros errores que puedan surgir. No sé cuáles serían.
flickerfly