2009-08-25 7 views
17

üzerinde CVS dizini silmek Şimdiye kadar bu ile geldim:Senaryo yinelemeli sunucuda

, şimdiye dek yerel çalıştı
find . -name 'CVS' -type d -exec rm -rf {} \; 

, herkes olası sorunları görebilir? Bunun temel olarak yinelemeli olarak bir sunucuya yüklenen 'CVS' dizinlerini silmesini istiyorum.

Ayrıca, temizlemek için bir dizin belirtebildiğim bir betiği nasıl yapabilirim? yapmak

cevap

13

Peki, apaçık ihtar rm: olurlarsa olsun CVS dizinleri ya da değilseniz arasında CVS adlı dizinleri sileriz.

Sen oldukça kolay bir komut dosyası dönüştürebilirsiniz:

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

düzenlemek

sen daha güvenli/daha hamlede yapmak istiyorsanız, eğer ilk sonra böyle bir şey yapabileceğini/fi bloğu (bunu yazmak için çeşitli yollar vardır): Eğer (gerçekten bunu yapmak içindir örneğin, yerine iptal edilme, bu yaratabileceğini) istediğiniz gibi

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

sen o kadar süslü yapabilirsiniz. Ya da göreceli yolları çözmeyi başarabilirdiniz, bu yüzden her zaman tam bir yol belirtmek zorunda kalmazsınız (ama sonra tekrar, belki de daha güvenli olmasını istersiniz).

+0

Bunun gibi xargs kullanarak ana endişe yeterli eşleşen dizinler, "rm -Rf" geçirilen komut satırının boyutunu taşması olabilir. "-s" için varsayılan değer tarafından sağlanan sınırın, xargs'in bunu yapmasını engellemesi gerekiyordu, hala bazı platformlarda çalışıyorum; Bu kontrol her yerde çok güvenilir görünmüyor. Burada herhangi bir problemden kaçınmak için, her zaman xargs için bir argüman olarak "-n 1" kullanıyorum, bu yüzden taşma endişeleri olmadan tüm boru girişlerini işleme yararı elde ediyorum. Bu noktada exec yi de kullanabiliyorsunuz çünkü hedeflediğiniz verimli kazanç ortadan kalkıyor. –

+0

ilginç. Bu betiğin rm -rf/yolu olması mümkün değil çünkü -name 'CVS' olmalı, doğru mu? Sadece emin olmak istiyorsun heh. –

+0

@meder: Doğru, '-name' nedeniyle rm -Rf/'yapamaz. Tabii ki,/srv/CVS'de oturan CVS deposunu mutlu bir şekilde kaldırabilir. Daha güvenli hale getirmek için daha fazla test yapmak isteyebilirsiniz. – derobert

2

basit bir yolu olacaktır:

bulmak. -iname CVS-type d | Xargs rf

+2

Hayır, herhangi bir CVS dizininin yolunda boşluk varsa, bu korkunç bir şekilde kırılacaktır. Bulmanız gerekir… -print0 | xargs -0… ' – derobert

+2

Ayrıca, CVS dizinleri her zaman büyük harf olduğundan,' -iname' yalnızca yanlış pozitifler için yalvarıyor. – derobert