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.

Niks
fuente
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

William Pursell
fuente
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
liwp_Stephen
fuente
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
Jindra Helcl
fuente
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
greperror
fuente
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
nbeuchat
fuente
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

P1kachu
fuente
-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

nLee
fuente
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