Estoy escribiendo un archivo MAKE que limpiará algunos archivos inútiles al final de la compilación. Si ya se ha creado un objetivo, por supuesto se saltará ese objetivo y es posible que el archivo inútil no esté allí. Entonces si hago esto:
rm lexer.ml interpparse.ml interpparse.mli
Es posible que obtenga errores porque uno de los archivos no existe. ¿Hay alguna forma de decir rm
que ignore estos archivos?
Al leer la página del 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 casi como lo que quiero, pero no estoy muy seguro de la parte de permisos. ¿Hay alguna forma de hacer esto?
rm
en una caja de arena? Parece que-f
hace exactamente lo que quieres, sin importar el tipo de problema.-f
opción aún intentará eliminarlo. Fallará. No te dirá que falló. Útil si el nombre de archivo es una variable o un globo.rm --interactive=never
cuales actúan como,rm -f
excepto que devuelve un estado de salida de error. ver aquí para más detalles: unix.stackexchange.com/questions/72864/…Respuestas:
La
-f
opción es definitivamente lo que quieres usar.La confirmación sobre los permisos de archivo a los que se refiere es esta:
Por
rm
lo tanto, te advertirá si intentas eliminar un archivo en el que no tienes permisos de escritura. Esto está permitido si tiene permisos de escritura en el directorio, pero es un poco extraño, por lo querm
normalmente le advierte al respecto.fuente
-i
.set -e
en todos mis scripts de bash para que el script salga después de que cualquier comando dé un error. A menudo quiero un script que me diga si serm
produjo un error, pero continúo de todos modos. continúaOtra solución es esta: https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command
Simplemente agregue una instrucción OR después de su comando:
De esta manera, cuando la declaración n. ° 1 falla (arroja un error), ejecute la declaración n. ° 2, que es simplemente
true
.fuente
rm -rf my/dir ||:
para ser aún más conciso (:
es la abreviatura detrue
)Llego tarde a la fiesta, pero uso esto todo el tiempo. En un archivo MAKE, agregue
-
al principio de una línea para ignorar el valor de retorno de esa línea. Al igual que:fuente
Si no desea utilizar la opción -f, una alternativa es:
Esto solo evitará que se impriman errores.
fuente
Si encuentra alguna forma de glob los nombres de archivo,
rm
no se quejará si no puede encontrar una coincidencia. Entonces, algo comolexer.m* interpparse.*
, etc., debería funcionar para usted (tenga cuidado de no eliminar demasiado, por supuesto). Además,-f
es un camino perfectamente razonable, 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.fuente
sudo rm -rf
.lexer.m?
...? Eso atraparíalexer.ml
ylexer.mz
, pero nolexer.mll
olexer.mla
.La opción -f significa que no se le preguntará si algo no es como se esperaba. No significa que los permisos no se tengan en cuenta.
Si no tiene suficientes privilegios para eliminar un archivo, no se eliminará.
PERO , si tiene suficientes privilegios para cambiar privilegios, su archivo será eliminado. Este es el caso cuando es el propietario de un archivo con permisos de solo lectura para el propietario (-r --------). Como propietario, puede
chmod u+w
, luego eliminarlo:rm -f
eliminará ese archivo.fuente
Tal vez podría ayudar una línea similar con:
Sé que esto no es muy inteligente, pero hace el trabajo.
fuente
Una alternativa:
Lástima que los Makefiles no puedan compartir definiciones de funciones de shell entre líneas.
fuente
Esto es lo que uso en los scripts de shell. Oculta el mensaje de error y el código de error.
fuente
rm doesnotexist 2&> /dev/null
Puede tocar los archivos antes de ejecutarlos. eso los crearía si no existen :-)
fuente
escriba
rm -rf ppp>/dev/null 2>&1
su mensaje de error más reciente. Se produce un problema, si el error no se genera en STDERR 2 sino en STDOUT 1 ... Se produce cuando el comando genera no error sino advertencia. Debe configurar el filtro y eliminar este mensaje. Pero este caso es ordinario.fuente
prueba para ver si el archivo existe primero, si es así, luego pásalo a rm. Entonces los errores de rm serán significativos. -f o ignorar el mensaje de error suele ser más abarcador de lo que una persona quiere. -f podría hacer cosas que no quieres que se hagan.
agregue más cláusulas de prueba si hay más archivos que desea asegurarse de que existan.
fuente