2009-08-25 13 views
17

Finora mi è venuta in mente questo:script per eliminare ricorsivamente directory CVS sul server di

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

Ha funzionato localmente finora, qualcuno può vedere eventuali problemi? Voglio che questo in pratica cancelli ricorsivamente le directory 'CVS' accidentalmente caricate su un server.

Inoltre, come posso renderlo uno script in cui posso specificare una directory da pulire?

risposta

13

Ebbene, l'avvertenza ovvia: Sarà cancellare directory chiamate CVS, a prescindere se sono le directory CVS o meno.

È possibile trasformarlo in uno script abbastanza facilmente:

#!/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 

modificare

Se vuoi renderlo più sicuro/più infallibile, si potrebbe fare qualcosa di simile dopo la prima, se/blocco fi (ci sono diversi modi per scrivere questo):

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

si può rendere sofisticato come desiderato (ad esempio, invece di abortire, si potrebbe spingere se veramente destinata a farlo). Oppure potresti fare in modo che risolva i percorsi relativi, quindi non dovrai specificare sempre un percorso completo (ma poi, forse vuoi, per essere più sicuro).

+0

Il problema principale dell'uso di xargs come questo è che con un numero sufficiente di directory corrispondenti, è possibile che la dimensione della riga di comando venga passata a "rm -Rf". Il limite fornito dal valore predefinito per "-s" dovrebbe impedire a xargs di farlo, ci sono ancora delle correzioni su alcune piattaforme; quel controllo non sembra essere molto affidabile ovunque. Per evitare qualsiasi problema, uso sempre "-n 1" come argomento per xargs, quindi ottengo il vantaggio di elaborare tutti gli input in pipe, senza problemi di overflow. A quel punto potresti anche usare exec perché il guadagno efficiente a cui miravi va via. –

+0

interessante. non c'è modo che questo script possa rm -rf/perché il -name deve essere 'CVS', giusto? Voglio solo assicurarmi, heh. –

+0

@meder: corretto, non può 'rm -Rf /' a causa di '-name'. Ovviamente, può rimuovere felicemente il repository CVS seduto in/srv/CVS'. Potresti voler aggiungere altri test per renderlo più sicuro. – derobert

2

Un modo semplice per farlo potrebbe essere:

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

+2

No, questo si interromperà orribilmente se ci sono spazi nel percorso verso qualsiasi directory CVS. Hai bisogno di 'find ... -print0 | xargs -0 ... ' – derobert

+2

Inoltre, poiché le directory CVS sono sempre in maiuscolo,' -iname' sta semplicemente supplicando i falsi positivi. – derobert

Problemi correlati