2009-11-27 16:43:23 +0000 2009-11-27 16:43:23 +0000
347
347

¿Cómo hago para que rm no dé un error si un archivo no existe?

Estoy escribiendo un makefile que limpiará algunos archivos inútiles al final de la compilación. Si ya se ha hecho un objetivo, por supuesto se saltará ese objetivo y el archivo inútil puede no estar ahí. Así que si hago esto:

rm lexer.ml interpparse.ml interpparse.mli

puedo obtener errores porque uno de los archivos no existe. ¿Hay alguna forma de decirle a rm que ignore estos archivos?

Al leer la página de manual, veo la siguiente opción:

-f Attempt to remove the files without prompting for confirma-
             tion, regardless of the file's permissions. If the file does
             not exist, do not display a diagnostic message or modify the
             exit status to reflect an error. The -f option overrides any
             previous -i options.

Eso suena como casi lo que quiero, pero no estoy muy seguro de la parte de los permisos. ¿Hay alguna manera de hacer esto?

Respuestas (11)

296
296
296
2009-11-27 16:54:52 +0000

La opción -f es definitivamente lo que quieres usar.

La confirmación sobre los permisos de archivo a la que se refiere es esta:

$ touch myfile    
$ chmod 400 myfile
$ rm myfile       
rm: remove write-protected regular empty file `myfile'?

Así que rm te advertirá si intentas eliminar un archivo sobre el que no tienes permisos de escritura. Esto está permitido si tienes permisos de escritura en el directorio pero es un poco raro, por lo que rm normalmente te advierte sobre ello.

132
132
132
2015-03-09 12:39:25 +0000

Otra solución es esta: https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command

Sólo agregue una declaración OR después de su comando:

rm -rf my/dir || true

De esta manera, cuando la declaración #1 falla (arroja error), ejecute la declaración #2, que es simplemente true.

79
79
79
2012-12-23 23:12:06 +0000

Llego tarde a la fiesta, pero uso esto todo el tiempo. En un makefile, añade - al principio de una línea para ignorar el valor de retorno de esa línea. Así:

-rm lexer.ml interpparse.ml interpparse.mli
14
14
14
2012-06-12 19:46:48 +0000

Si no quieres usar la opción -f, una alternativa es:

rm filethatdoesntexist 2> /dev/null

Esto sólo evitará que se impriman errores.

8
8
8
2009-11-27 16:48:43 +0000

Si encuentras alguna manera de glob los nombres de los archivos, rm no se quejará si no puede encontrar una coincidencia. Así que algo como lexer.m* interpparse.*, etc. debería funcionar para ti (ten cuidado de no borrar demasiado, por supuesto). Además, -f es una forma perfectamente razonable de hacerlo, siempre y cuando no esperes que los permisos de archivo te salven de eliminar un archivo que no querías - si no quieres eliminarlo, no lo pongas en la lista.

6
6
6
2009-11-27 19:27:29 +0000

La opción -f significa que no se le avisará si algo no es lo esperado. No significa que no se tengan en cuenta los permisos.

Si no tienes suficientes privilegios para eliminar un archivo, no será eliminado.

PERO , si tienes suficientes privilegios para cambiar los privilegios, tu archivo será eliminado. Este es el caso cuando usted es el propietario de un archivo con permisos de sólo lectura para el propietario (-r——–). Como propietario, puedes chmod u+w, y luego eliminarlo: rm -f eliminará ese archivo.

5
5
5
2011-03-11 10:36:07 +0000

Tal vez podría ayudar una línea similar con:

touch fakefile.exe fakefile.o && rm *.o *.exe

Sé que esto no es muy inteligente, pero hace el trabajo.

3
3
3
2015-06-11 13:55:15 +0000

Esto es lo que utilizo en los scripts de shell. Oculta el mensaje de error y el código de error.

rm doesnotexist 2> /dev/null || echo > /dev/null
3
3
3
2009-11-27 17:44:12 +0000

Una alternativa:

RmIfIsFile() { for f in "$@"; do [-f $f] && rm $f; done; }; RmIfIsFile lexer.ml interpparse.ml interpparse.mli

Lástima que los Makefiles no puedan compartir las definiciones de las funciones de la cáscara a través de las líneas.

1
1
1
2017-02-02 16:11:37 +0000

Puedes tocar los archivos antes de enviarlos. Eso los crearía si no existieran :-)

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli
1
1
1
2017-08-19 09:47:36 +0000

Escriba rm -rf ppp>/dev/null 2>&1, más reciente obtiene el mensaje de error “Problema ocurre, si el error no se genera en el STDERR 2 sino en el STDOUT 1”… Ocurre cuando el comando no genera un error sino una advertencia. Necesitas establecer un filtro y eliminar este mensaje. Pero este caso es ordinario.