2009-08-25 8 views
17

Hasta ahora he llegado con esto:Script para borrar recursivamente el directorio CVS en el servidor

find . -name 'CVS' -type d -exec rm -rf {} \; 

Ha funcionado a nivel local hasta el momento, nadie puede ver cualquier problema potencial? Quiero que esto básicamente elimine recursivamente los directorios 'CVS' cargados accidentalmente en un servidor.

Además, ¿cómo puedo convertirlo en un script en el que puedo especificar un directorio para limpiar?

Respuesta

13

Bueno, la advertencia obvia: Se va a borrar directorios llamados CVS, independientemente de si son o no los directorios CVS.

Puede convertirlo en un guión bastante facilidad:

#!/bin/sh 

if [ -z "$1" ]; then 
    echo "Usage: $0 path" 
    exit 1 
fi 

find "$1" -name 'CVS' -type d -print0 | xargs -0 rm -Rf 
# or find … -exec like you have, if you can't use -print0/xargs -0 
# print0/xargs will be slightly faster. 
# or find … -exec rm -Rf '{}' + if you have reasonably modern find 

edición

Si desea hacerlo más seguro/más a toda prueba, que podría hacer algo como esto después de que el primero si/fi bloque (hay varias maneras de escribir esto):

⋮ 
case "$1" in 
    /srv/www* | /home) 
     true 
     ;; 
    *) 
     echo "Sorry, can only clean from /srv/www and /home" 
     exit 1 
     ;; 
esac 
⋮ 

usted puede hacer que sea tan elegante como desee (por ejemplo, en lugar de abortar, que podría llevar a que si realmente pretende hacer eso). O puede hacer que resuelva caminos relativos, por lo que no tendrá que especificar siempre una ruta completa (pero, de nuevo, tal vez quiera eso, para estar más seguro).

+0

La principal preocupación con el uso de xargs como este es que con suficientes directorios coincidentes, puede desbordar el tamaño de la línea de comando pasada a "rm -Rf". Se supone que el límite proporcionado por el valor predeterminado para "-s" previene que xargs haga eso, todavía lo encuentro en algunas plataformas; ese cheque no parece ser muy confiable en todas partes. Para evitar cualquier problema aquí, siempre uso "-n 1" como un argumento para xargs, por lo que obtengo el beneficio de procesar toda la entrada canalizada, sin preocupaciones de desbordamiento. En ese momento, también podría usar exec porque la ganancia eficiente que buscaba desaparece. –

+0

interesante. no hay forma de que este script pueda rm -rf/porque el -name tiene que ser 'CVS', ¿verdad? Sólo quiero asegurarme, je. –

+0

@meder: Correcto, no puede 'rm -Rf /' debido a '-name'. Por supuesto, puede eliminar felizmente el repositorio de CVS que se encuentra en '/ srv/CVS'. Es posible que desee agregar más pruebas para que sea más seguro. – derobert

2

Una forma sencilla de hacerlo sería:

hallazgo. -iname CVS -type d | xargs rm-rf

+2

No, eso se romperá horriblemente si hay espacios en el camino a cualquier directorio de CVS. Necesitas 'encontrar ... -print0 | xargs -0 ... ' – derobert

+2

Además, dado que los directorios CVS siempre están en mayúsculas,' -iname' solo pide falsos positivos. – derobert

Cuestiones relacionadas