Eliminar archivos en el directorio sin errores si ya está vacío

31

Como parte de un script de implementación, quiero volcar algunas cosas en caché de mi directorio temporal. Yo uso un comando como:

rm /tmp/our_cache/*

Sin embargo, si /tmp/our_cacheestá vacío (bastante común cuando se envían muchos cambios en rápida sucesión a nuestro servidor de prueba), esto imprime el siguiente mensaje de error:

rm: cannot remove `/tmp/our_cache/*': No such file or directory

No es un gran problema, pero es un poco feo y quiero reducir la relación ruido / señal en la salida de este script.

¿Cuál es una forma concisa en Unix para eliminar el contenido de un directorio sin recibir mensajes quejándose de que el directorio ya está vacío?

Mark Amery
fuente

Respuestas:

48

Dado que presumiblemente desea eliminar todos los archivos sin preguntar, ¿por qué no usar el -finterruptor rmpara ignorar los archivos inexistentes?

rm -f /tmp/our_cache/*

Desde la página del manual:

-f, --force
          ignore nonexistent files, never prompt

Además, si puede haber subdirectorios /tmp/our_cache/y desea que también se eliminen esos y sus contenidos, no olvide el -rinterruptor.

depquid
fuente
3
¡La solución más obvia y no lo pensé! Me siento como el primer chico en este cómic xkcd.com/399 ;-)
Huygens
6
find /tmp/our_cache/ -mindepth 1 -delete

Editar 1

eliminado "-tipo f

Editar 2

Se agregó una opción no estándar -mindepth 1para evitar que se elimine el directorio raíz de búsqueda (después de eliminar la -type flimitación).

Hauke ​​Laging
fuente
Solo una nota, dejaría de lado -type fya que también puede haber directorios temporales (aunque el ejemplo en la pregunta no los tiene en cuenta, por lo que probablemente no estén allí ...)
Izkata
1
el uso -type fsolo eliminará los archivos normales, por lo que los enlaces simbólicos, por ejemplo, no se eliminarán.
Huygens
@rush Lo siento, no lo comprobé, pero solo eché un vistazo a las páginas de manual que dicen "Eliminar archivos", sin mencionar directorios de todos modos. Borro mi comentario
Hauke ​​Laging
1
Eso elimina, /tmp/our_cachepor lo que bien podría hacerlo rm -r /tmp/our_cache. Mientras usa opciones no estándar, puede usarlas -mindepth 1. Tenga en cuenta que rm /tmp/our_cache/*, al contrario , también elimina los subdirectorios y su contenido y archivos ocultos.
Stéphane Chazelas
2

Puede redirigir el error estándar para /dev/nullque no imprima esto

$  rm /tmp/our_cache/* 2>/dev/null
Pradeepchhetri
fuente
2
¿No suprimiría esto también los errores que se muestran si, por ejemplo, un archivo no se puede eliminar porque está en uso? El único error que quiero suprimir es el que se muestra si el directorio de destino está vacío; Esto parece tener efectos secundarios no deseados.
Mark Amery
Incluso si intenta eliminar algún archivo que algún proceso ha abierto, no obtendrá un error.
pradeepchhetri
1

Otra forma (aunque un poco exagerada ...):

[ ! -z "$(ls -A /tmp/our_cache/)" ] && rm -rf /tmp/our_cache/*

esto usa testo [para probar si la cadena regresó de ejecutar unls en su directorio no está vacía. Entonces, si, y solo si, esa cadena NO está vacía, eliminará todo lo que se encuentre debajo de su directorio.

NOTA: dejar el globo fuera de él lssuprimirá el error de ningún archivo.

h3rrmiller
fuente
-1

Si su script es usin BASH, puede probar:

if test "$(ls /tmp/our_cache/)" !=  ""; then rm /tmp/our_cache/*; fi

Si lo hace, seguirá produciendo un error si hay un problema "real" o si un archivo está protegido (entonces necesitaría el -fmodificador derm para eliminar este tipo de archivos), pero evitará el error cuando no haya archivos.

Si utiliza otro shell que BASH para sus secuencias de comandos, como zsh, ksh, puede probar esta otra sintaxis que podría ser más portátil:

if [[ "$(ls /tmp/our_cache/)" !=  "" ]]; then rm /tmp/our_cache/*; fi
Huygens
fuente