comprobar si el directorio existe y eliminar en un comando unix

106

¿Es posible verificar si existe un directorio y eliminarlo si existe, en Unix usando un solo comando? Tengo una situación en la que uso la tarea ANT 'sshexec' en la que puedo ejecutar solo un comando en la máquina remota. Y necesito verificar si el directorio existe y eliminarlo ...

remover
fuente
¿Por qué no usar rmdir? si el directorio no existe, fallará.
Ferruccio
4
Fracasará. Y error en mi script ANT. Eso hará que mi construcción falle.
remo
El uso mkdir -pignorará los errores si ya existen.
user562374
2
@ Ferruccio- el uso de rm -rf / dir_name no arroja un error pero rm -rf / dir_name arroja dice No se encontró tal archivo o directorio. (Recién probado)
remo
3
@remo bro acaba de publicar el mismo comando dos veces
Marcos Pereira

Respuestas:

149

Suponiendo que $WORKING_DIRestá configurado en el directorio ... esta línea debería hacerlo:

if [ -d "$WORKING_DIR" ]; then rm -Rf $WORKING_DIR; fi

(de lo contrario, simplemente reemplácelo con su directorio)

Nick Grealy
fuente
161

¿Por qué no usar rm -rf /some/dir? Eso eliminará el directorio si está presente; de ​​lo contrario, no hará nada. A diferencia de rm -r /some/direste tipo de comando, el comando no se bloqueará si la carpeta no existe.

Dominic Mitchell
fuente
13
Creo que la pregunta original pretendía significar: realice la eliminación solo cuando el archivo / directorio exista o no. Este comando puede funcionar y producir resultados similares, pero hacer una prueba antes del comando tiene más sentido.
Ankur Chauhan
5
@AnkurChauhan +1, recibí una advertencia si el directorio no existe.
inf3rno
12
Ésta no es la respuesta a la pregunta.
xpto
10
Como se indicó anteriormente, esta no es la respuesta. Una razón para probar antes de eliminar sería dentro de un trabajo de Jenkins. Si el directorio no existe e intenta eliminarlo, el trabajo fallará. Verificar de antemano es la mejor opción.
leñador
8
Creo que esta es la respuesta correcta. hace lo que necesita @remo, es decir, elimina un directorio solo si existe y no da un error si no existe. Tal vez la pregunta no esté del todo bien planteada porque ¿por qué necesitarías verificar la existencia cuando a este comando no le importa?
pedram bashiri
32

Tratar:

bash -c '[ -d my_mystery_dirname ] && run_this_command'

EDITAR : Esto funcionará si puede ejecutar bash en la máquina remota ...

EDITAR 2 : En bash, [ -d something ]verifica si hay un directorio llamado 'algo', devolviendo un código de éxito si existe y es un directorio. Encadenar comandos con && ejecuta el segundo comando solo si el primero tuvo éxito. Entonces [ -d somedir ] && commandejecuta el comando solo si el directorio existe.

sinelaw
fuente
Sí, y pruébalo en un caparazón para asegurarte de que sea lo que quieres.
sinelaw
Primero quiero ver si funciona localmente y les puedo enviar el comando de forma remota. ¿Estoy mirando diciendo que revise el directorio "/ test" ... solo [-d / test] && mkdir / test?
remo
1
Debería dar un error si existe, porque comprueba si el directorio existe, y si es así intenta crearlo. Eso es lo que hace por mí (recién probado). No debería crear un directorio. Como desea BORRAR, probablemente necesite: [ -d /test ] && rmdir /test(o rm -rf / test si no va a estar vacío y desea eliminar todo el contenido)
sinelaw
@SineLaw: NOTA - ¡No se produjo un error cuando el directorio existía para mí e intentaba crear un directorio! (lo probé de nuevo). Pero para DELETE funciona. Por favor revise eso
remo
sharma: ¿estás usando bash? ¿Qué dice 'echo $ SHELL'?
sinelaw
0

Aquí hay otro trazador de líneas:

[[ -d /tmp/test ]] && rm -r /tmp/test
  • && significa ejecutar la declaración que sigue solo si la declaración anterior se ejecutó correctamente (devolvió el código de salida cero)
Akhilesh Joshi
fuente