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).
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. –
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. –
@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