No te molestes en comprobar si el archivo existe, solo intenta eliminarlo.
rm -f /p/a/t/h
# or
rm /p/a/t/h 2>/dev/null
Tenga en cuenta que el segundo comando fallará (devolverá un estado de salida distinto de cero) si el archivo no existía, pero el primero tendrá éxito debido a la opción -f(abreviatura --force). Dependiendo de la situación, esto puede ser un detalle importante.
Pero lo más probable es que si está agregando al archivo es porque su script está usando >>para redirigir algo al archivo. Solo reemplace >>con >. Es difícil de decir ya que no has proporcionado ningún código.
Tenga en cuenta que puede hacer algo como test -f /p/a/t/h && rm /p/a/t/h, pero hacerlo es completamente inútil. Es muy posible que la prueba vuelva a ser verdadera, pero / p / a / t / h no existirá antes de intentar eliminarla, o peor aún, la prueba fallará y se creará / p / a / t / h antes de ejecutar el siguiente comando que espera que no exista. Intentar esto es una condición clásica de carrera. No lo hagas
Esto no es útil si necesitan saber si existió y se eliminó. Comer stderr no proporciona eso. No manejar la existencia no le permite ejecutar un script más amplio sin fallar.
uchuugaka
@uchuugaka Esta es una solución simple cuando no te importa si hay un archivo, todo lo que quieres es asegurarte de que no esté allí.
Lukas Liesis
Las buenas respuestas deben ser comunicativas y completas sobre los efectos colaterales es la generalización de mi mensaje, pero los scripts de shell con frecuencia quieren saber qué se encuentra o no, y qué se actúa o no.
uchuugaka
rm /p/a/t/h 2> /dev/nullno mantendrá el código de retorno ( echo $?) como 0 si el archivo no existe. Eso haría que el tipo de trabajos de Jenkins fallara solo porque intentamos eliminar un archivo no existente.
ViFI
@uchuugaka: he evitado responder a este comentario durante bastante tiempo, pero es necesario abordarlo. Comprobar si el archivo existe antes de eliminarlo siempre es una mala idea. Ver el párrafo final de mi respuesta. Hay una condición de raza inherente que simplemente no se puede evitar haciendo ese tipo de cosas. Si no desea sobrescribir un archivo existente, puede probar algo de magia específica de shell (como noclobberen bash), o tal vez modificar el archivo existente para que la redirección falle si el archivo existe (no evita la condición de carrera), pero todo lo que hará es hacer que los errores sean más sutiles.
Simple y fácil de leer y también garantiza que echo $?no se obtiene 1 si el archivo no existe.
ViFI
Si es necesario, también puede hacerlo como una línea, vea mi respuesta a continuación.
nbeuchat
65
Si desea ignorar el paso para verificar si el archivo existe o no, puede usar un comando bastante sencillo, que eliminará el archivo si existe y no arrojará un error si no existe.
rm $my_file
, ¿verdad? ¿Qué caparazón estás usando?Respuestas:
No te molestes en comprobar si el archivo existe, solo intenta eliminarlo.
Tenga en cuenta que el segundo comando fallará (devolverá un estado de salida distinto de cero) si el archivo no existía, pero el primero tendrá éxito debido a la opción
-f
(abreviatura--force
). Dependiendo de la situación, esto puede ser un detalle importante.Pero lo más probable es que si está agregando al archivo es porque su script está usando
>>
para redirigir algo al archivo. Solo reemplace>>
con>
. Es difícil de decir ya que no has proporcionado ningún código.Tenga en cuenta que puede hacer algo como
test -f /p/a/t/h && rm /p/a/t/h
, pero hacerlo es completamente inútil. Es muy posible que la prueba vuelva a ser verdadera, pero / p / a / t / h no existirá antes de intentar eliminarla, o peor aún, la prueba fallará y se creará / p / a / t / h antes de ejecutar el siguiente comando que espera que no exista. Intentar esto es una condición clásica de carrera. No lo hagasfuente
rm /p/a/t/h 2> /dev/null
no mantendrá el código de retorno (echo $?
) como 0 si el archivo no existe. Eso haría que el tipo de trabajos de Jenkins fallara solo porque intentamos eliminar un archivo no existente.noclobber
en bash), o tal vez modificar el archivo existente para que la redirección falle si el archivo existe (no evita la condición de carrera), pero todo lo que hará es hacer que los errores sean más sutiles.Otro comando de una línea que utilicé es:
fuente
Puedes usar esto:
fuente
echo $?
no se obtiene 1 si el archivo no existe.Si desea ignorar el paso para verificar si el archivo existe o no, puede usar un comando bastante sencillo, que eliminará el archivo si existe y no arrojará un error si no existe.
fuente
-f
eso no arrojaría un error. Esta respuesta me ayudó, gracias.Un script de shell de una línea para eliminar un archivo si ya existe (según la respuesta de Jindra Helcl):
[ -f file ] && rm file
o con una variable:
fuente
Algo como esto funcionaría
-f comprueba si es un archivo normal
-e comprueba si el archivo existe
EDITAR: -e usado con -f es redundante, para usar -f solo debería funcionar también
fuente
-a
está en desuso, úselo en su-e
lugar.-f
.-e
de-fe
es redundante, ya que-f
también comprueba la existencia del archivo por lo que yo sé ..if [ $( ls <file> ) ]; then rm <file>; fi
Además, si redirige su salida con, en
>
lugar de>>
ello, sobrescribirá el archivo anteriorfuente
file
es algo así5 -lt 2