script de shell para eliminar un archivo si ya existe


183

Estoy trabajando en algunas cosas donde estoy almacenando datos en un archivo. Pero cada vez que ejecuto el script, se agrega al archivo anterior.

Quiero ayuda sobre cómo puedo eliminar el archivo si ya existe.


3
Comprueba si el archivo existe ... y luego llama rm $my_file, ¿verdad? ¿Qué caparazón estás usando?
Chris Sprague

Respuestas:


184

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


55
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.
William Pursell

127

Otro comando de una línea que utilicé es:

[ -e file ] && rm file

11
O alternativamente: [ ! -e archivo] || archivo rm. Esta versión devuelve 0 en lugar de algún error.
nawfel bgh

@nawfelbgh Gracias, esto es genial para encadenar en un script más largo.
Abe

83

Puedes usar esto:

#!/bin/bash

file="file_you_want_to_delete"

if [ -f $file ] ; then
    rm $file
fi

44
Esta debería ser la respuesta seleccionada.
Ingernet

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 -f xyz.csv

1
Esto es solo un duplicado de parte de la respuesta mejor calificada, de 2015.
forgivenson

16
la respuesta principal no explicaba que con -feso no arrojaría un error. Esta respuesta me ayudó, gracias.
Doug

De acuerdo con Doug, aunque este parece ser un buen caso de uso para una edición similar a un wiki de una respuesta.
Philip

16

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:

#!/bin/bash

file="/path/to/file.ext"
[ -f $file ] && rm $file

13

Algo como esto funcionaría

#!/bin/sh

if [ -fe FILE ]
then 
    rm FILE
fi 

-f comprueba si es un archivo normal

-e comprueba si el archivo existe

Introducción a if para más información

EDITAR: -e usado con -f es redundante, para usar -f solo debería funcionar también


-aestá en desuso, úselo en su -elugar.
mziccard

mi mal, arreglado. Gracias @mziccard
P1kachu

esto arrojará errores en directorios o enlaces u otros archivos no normales. En mi opinión, es mejor / más seguro de usar-f .
Jindra Helcl

1
Okay. aún así, el -ede -fees redundante, ya que -ftambién comprueba la existencia del archivo por lo que yo sé ..
Jindra Helcl

Si edito, solo haré un duplicado de su respuesta, pero lo precisaré
P1kachu

4

if [ $( ls <file> ) ]; then rm <file>; fi

Además, si redirige su salida con, en >lugar de >>ello, sobrescribirá el archivo anterior


3
esto no es una frase, lo siento, pero la @liwp_Stephen es esa.
fiorentinoing

Incluso si se cita correctamente, esto se rompe si filees algo así5 -lt 2
William Pursell el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.