Tüm .svn dizinlerini uygulama dizinlerimden kaldırma


192

Uygulamamda bulunan bir dışa aktarma aracının görevlerinden biri, .svnuygulama dizin ağacımdaki tüm dizinleri temizlemektir . Linux kabuğunda tüm ağacı geçip .svndosyaları silecek özyinelemeli bir komut arıyorum .

Bu komut dosyası SVN ile ilgili olmayan diğer bazı dosya / dizin adları için kullanılacağından ihracat kullanmıyorum. Gibi bir şey denedim:

find . -name .svn | rm -fr

İşe yaramadı ...


3
'Xargs rm -rf' kullanıyorsanız komutunuz çalışmalıdır
Peter van der Heijden

1
Ayrıca dizinleri silmek istediğinizden emin olmak için delete komutunu "rm -rfi" de değiştirmek isteyebilirsiniz.
bedwyr

Ama xargs kullanmayın .. içinde boşluklar vb dizinleri ile sorun olacak. Aşağıda açıklandığı gibi bul kullanın.
John Hunt

Yanıtlar:


438

Bunu dene:

find . -name .svn -exec rm -rf '{}' \;

Böyle bir komutu çalıştırmadan önce, genellikle bunu önce çalıştırmak isterim:

find . -name .svn -exec ls '{}' \;

43
Dizinlerde boşluk veya bu tür karakterler varsa {} tek tırnak içine almanız gerekebilir:find . -name .svn -exec rm -rf '{}' \;
mtoloo

38
Bu test benim bash daha iyi çalışır:find . -name .svn -exec echo {} \;
Fedir RYKHTIK

6
İlk önce echo / ls çalıştırmak bu cevaba 'profesyonel' dokunuş. Herhangi bir aptal bir sistemi yıkabilir.
John Hunt

6
ne gelmez {} \;mi?
Jon Mitten

3
İkinci komutu da çalıştırarak çıktı lsalıyorum entries prop-base props text-base tmp...
Rasoul

51

Yazdıklarınız, yeni satırla ayrılmış dosya adlarının (ve yollarının) bir listesini rm , ancak rm bu girdiyle ne yapılacağını bilmez. Sadece komut satırı parametrelerini bekliyor.

xargs genellikle yeni satırlarla ayrılmış girdileri alır ve bunları komut satırına yerleştirir, bu nedenle xargs eklemek çalıştığınız şeyi yapar:

find . -name .svn | xargs rm -fr

xargsyalnızca rmkabul edebildiği kadar çok argüman iletecek kadar zekidir . Böylece, bir milyon dosyanız varsa,rm 1.000.000 / 65.000 kez (kabuğunuz {{kk için 65k dosya + 1 için -fr} komut satırında 65,002 bağımsız değişkeni kabul edebiliyorsa).

Kişilerin yeterince işaret ettiği gibi, aşağıdakiler de işe yarar:

find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf

İlk iki -execform rmsilinen her bir klasörü çağırır , bu nedenle 1.000.000 klasörünüz varsa rm1.000.000 kez çağrılır. Bu kesinlikle idealden daha az. Daha yeni uygulamalar rm, komutu mümkün olduğunca çok sayıda argümanı kabul edecek bir +göstergeyle sonuçlandırmanıza izin verir rm:

find . -name .svn -exec rm -rf {} +

Son find / xargs sürümü, \0bir satırsonu yerine sonlandırıcı olarak kullanılan find üretme çıktısı yapan print0 kullanır . POSIX sistemleri \0dosya adında herhangi bir karaktere izin verdiğinden, argümanların doğru bir şekilde iletildiğinden emin olmanın en güvenli yolu budurrm veya uygulamaya .

Ayrıca , temel dizinde değil, dosyanın bulunduğu dizinde -execdiryürütülecek rmve -depthönce derinliği başlatacak bir.


31

Boru, xargs, exec veya herhangi bir şeye gerek yok:

find . -name .svn -delete

Düzenleme: Sadece şaka, açıkça başlık altında -deleteçağırır unlinkat(), bu yüzden unlinkveya gibi davranır rmdirve dosyaları içeren dizinlerde çalışmayı reddeder.


54
Bir sorun, -deletedosyalar içeriyorsa bir dizine dokunmaz.
Xeoncross

2
Yüklem -forceiçin özyinelemeli veya özyinelemeli bayrak yoktur -delete, bu nedenle bu cevap işe yaramaz. Böylece, geri içelim |xargs rm -rfsonra yazın daha az çirkin olan -execçirkin tutucuları ve noktalı virgül ile: -exec rm -rf '{}' \;.
Tomasz Gandor

13

.Svn dizinini silmek için zaten birçok yanıt verilmiştir. Ama eklemek istiyorum, bir dizin yerine bir ihracat yaparsanız, bu dizinleri baştan başlatabilirsiniz ki:

svn export <url>

+1, svn için zaten yerleşik olduğunda bunu tekrarlamaya gerek yoktur.
Powerlord

1
Bu yaklaşımda gördüğüm tek sorun, dışa aktarılmamış sürüm dosyalarını korumak istiyorsanız. Svn dokümanlarında, "Tüm yerel değişiklikler korunacak, ancak sürüm kontrolü altında olmayan dosyalar kopyalanmayacak."
raidfive

@raidfive: Genellikle projenin kutudan çıkması için tüm ilgili dosyaların sürüm kontrolü altında, hatta kütüphaneler kullanılmasını tercih ederim. Bu kurulumdaki sürümlendirilmemiş dosyalar derleme ikili dosyalarıdır ve bunlar derleme dosyasındaki bir hedef tarafından yeniden oluşturulur. Ancak haklısınız, projeniz sürüm kontrolü altında olmayan dosyalara dayanıyorsa, dışa aktarma işe yaramaz.
Kasım'da Mnementh

ama ... daha genel bir cevaba ihtiyacım vardı. .Svn sadece en yaygın örnekti.
Itay Moav -Malimovka

12

Eğer çok görmek istemiyorsanız

find: `./.svn': No such file or directory

ardından -depthanahtarı kullanın :

find . -depth -name .svn -exec rm -fr {} \;

10

Windows'ta, sağ tıklama bağlam menünüze "SVN Klasörlerini Sil" i eklemek için aşağıdaki kayıt defteri komut dosyasını kullanabilirsiniz. Bu sinir bozucu dosyaları içeren herhangi bir dizinde çalıştırın.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]
@="Delete SVN Folders"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \""

Düzgün hile. OP için yararlı değil, ama etkilendim çünkü +1!
rrhartjr

bu harika. Teşekkürler. bunun çok eski olduğunu biliyorum, ama her neyse. Yine de seviyorum.
Anthony

9

Neredeyse vardı. Bir komutun çıktısını başka bir komut olarak parametre olarak iletmek istiyorsanız, xargs kullanmanız gerekir. Ekleme -print0, komut dosyasının boşluk içeren yolları işleyebilmesini sağlar:

find . -type d -name .svn -print0|xargs -0 rm -rf

2
bazı reson için sonunda işe yarayan bulmak oldu. -name .svn | xargs rm -rf Versiyonunuz bana yön verdi, teşekkürler
Itay Moav -Malimovka


4

Eğer kullanmak istediğinizde önemli bir konu olarak, kabuk .svn klasörleri silmek için ihtiyacınız -depth örn gibi hata mesajları sadece silindi dizini giren ve gösteren bulmak komutu önlemek için argüman

"find: ./.svn: No such file or directory"

Sonuç olarak, find komutunu aşağıdaki gibi kullanabilirsiniz:

cd [dir_to_delete_svn_folders]
find . -depth -name .svn -exec rm -fr {} \;

Aradığım şey bu ve doğru cevap olmalı.
luckytaxi


2

Alternatif olarak, çalışan bir kopyayı değiştirmeden bir kopyasını dışa aktarmak istiyorsanız rsync'i kullanabilirsiniz:

rsync -a --exclude .svn path/to/working/copy path/to/export

1
Ya da temelde aynı şeyi yapan svn export / path / to / repository komutunu kullanın.
Kaleb Pederson

Yazar özellikle svn kullanmak istemediğini söyledi; belki de onun hedef ortamında svn yüklü değil.
pimlottc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.