OS X'te alt sürüm dosyaları ve klasörleri hariç tüm dosya ve klasörleri kopyalayın


14

Tüm dosya ve klasörleri bir dizinden diğerine kopyalamaya çalışıyorum, ancak belirli dosyaları hariç tutuyorum. Özellikle, alt sürüm dosyaları ve klasörleri hariç tutmak istiyorum. Ancak genel ama özlü bir çözüm istiyorum.

Yakın gelecekte birkaç tür dosyayı hariç tutma ihtiyacını bulacağımı düşünüyorum. Örneğin, .svn, * .bak ve * .prj'yi hariç tutmak isteyebilirim.

İşte benim için böyle bir araya getirdim, ama benim için çalışmıyor. İlk bölüm, iş bulmak, ama ben xargs ve cp ile yanlış bir şey yapıyorum . Ben ile ve olmadan cp denedim -R. Ayrıca, OS X kullanıyorum ve Linux sistemlerinden daha az özellikli xargs sürümüne sahip gibi görünüyor .

find ./sourcedirectory -not \( -name .svn -a -prune \)
     | xargs -IFILES cp -R FILES ./destinationdirectory

Yanılıyor olabilirim, ama bunun düşündüğünüzden daha zor olduğunu düşünüyorum. Senin bile findkomut düzgün kullanır -pruneöğeleri .svn dışlamak için, daha sonra pas -Rbayrağı cpsöyler o özyinelemeli olmak komutu. Bunu yaptığınızda, findkomutta sahip olduğunuz ayrıntı düzeyini kaybedersiniz . Bir dakika bununla tinker gidiyorum ama cevap olduğunu düşünüyorum değil kullanımına -Riçinde cpkomuta.
Telemachus

Benim için bir Linux sisteminde çalışıyor gibi görünüyor. "Çalışmıyor" un ne anlama geldiğinden daha açık olabilir misiniz? Hata mesajı var mı? Beklediğiniz dosyaları alınıyor / kopyalanmıyor mu?
sonraki duyuruya kadar duraklatıldı.

Bu var -Rben eminim, bayrağı. Bunu kaldırın ve iyi olmalısınız ( -mindepth 1kopyalamak istemediğiniz en üst düzey dizin klasörünü yok saymak için eklemek isteyebilirsiniz, ancak sanırım)
Telemachus

Genellikle bunları her şeyi kopyalayıp hedef dizinlerdeki istenmeyen dosyaları silerek yaparım. Bu genellikle daha basittir.
Jan Doggen

Yanıtlar:


22

(Soruyu yeniden okuduktan sonra düzenlenmiştir. Soru soran kişi rsync'in kurulu olmadığını söylüyor)

Find / xargs çözümünüzle ilgili olası bir sorun, dosya adlarındaki boşluklardır. Bu sorunu aşmak için, find ve xargs öğelerine, bulunan dosyaları ayırmak için boş bir karakter (ASCII 0) kullanmasını söyleyin:

find ./sourcedirectory -not ( -name .svn -a -prune ) -print0 | xargs -0 -IFILES cp FILES ./destinationdirectory

Rsync'in kullanılabilir olduğunu düşünüyorsanız, rsync'in çok daha iyi bir çözüm olduğunu düşünüyorum:

-C seçeneğiyle rsync kullanın. Gönderen rsync man sayfasında :

Bu, genellikle sistemler arasında aktarmak istemediğiniz çok çeşitli dosyaları hariç tutmak için yararlı bir kestirme yöntemdir. Bir dosyanın yoksayılması gerekip gerekmediğini belirlemek için CVS'ye benzer bir algoritma kullanır.

Bu rsync'e şu kalıpları görmezden gelmesini söyleyecektir:

RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo *~
#* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj 
*.so *.exe *.Z *.elc *.ln core .svn/ .git/ .bzr/

Örneğin:

rsync -avC /path/to/source/directory /path/to/destination/directory

(not: Henüz rsync'e aşina değilseniz, rsync'in kaynak yolundaki sondaki eğik çizgiyle nasıl başa çıktığını o sayfada okuduğunuzdan emin olun. Eğik çizgiyi eklemediğinizden daha farklı davranır. 'Trailing slash' araması yapın)


Fareler, sadece sorunuzu tekrar okudum ve rsync'in yüklü olmadığını söylediğini gördüm. MacBook Pro'mda (OS X 10.6.1) / usr / bin / rsync içinde. Benim için Tiger (10.4) ve Leopard (10.5) altında kuruldu.
Doug Harris

Eminim ki siz (ve OP) komuta kısmında -Rbayrak istemiyor xargs.
Telemachus

İyi yakaladım, bunu orijinal sorudan kopyaladım. Şimdi düzenleyecek.
Doug Harris

1
Teşekkürler Doug! Vaaz ettiğim bir şey, "iş için doğru aracı kullan". Son zamanlarda Windows dünyasından OSX'e geldim ve hala cehaletle uğraşıyorum. Aynı soruyu bir linux kanalında yayınladım ve birisi hızlı bir şekilde dedi, sadece "rsynch" kullanın Terminalde "rsynch" yazdım ve var olmadığını gördüm ve bulmak araştırmaya devam | xargs yaklaşımı. Biraz inatçıyım. Her neyse, OSX varsayılan olarak "rsync" içeriyor ve yayınınız çok yardımcı oldu. Burada hangisinin daha iyi olduğunu bilmeye yetecek kadar deneyimim yok, ama rsync'in çok daha özlü olduğuna eminim. Teşekkürler!
Michael Prescott

OS X'teki çalışmalarınıza ek olarak linux makineleri ile herhangi bir iş yapacaksanız, rsync'in nasıl kullanılacağını öğrenmek için zaman ayırmaya değer olduğunu düşünüyorum. Birincil işlevselliği, sadece değiştirilen şeylerin akıllıca kopyalanmasıdır (pencerelere aşina iseniz, robokopi gibi). Yalnızca deltayı kopyaladığından, (Time Machine olmayan) yedeklemeleri, kod dağıtımlarını ve benzerlerini işlemek için harika bir yoldur.
Doug Harris

2

Genel çözümler değil ... svn export komutunu kullanarak .svn meta veri klasörleri olmadan çalışma alanının bir kopyasını oluşturabilirsiniz.


Rahatsız edici olmamak, ama bu cevabın neden oylandığından emin değilim. SVN'nin yeteneklerinin farkındayım, ancak "Genel ve özlü bir çözüm istiyorum. Yakın gelecekte birkaç dosya türünü hariç tutma ihtiyacını bulacağımı hayal ediyorum"
Michael Prescott

2
%> mkdir -p FOLDER_OUT && ( tar cf - FOLDER_OR_FILES_IN --exclude=.svn  | tar xvf - -C FOLDER_OUT )

Eğer isterseniz 2 katran işlemi arasına 'pv' veya benzeri bir şey koyabilirsiniz.


2

Kirli ama hızlı ve özlü bir yol:

cp -r source destination
find destination -iname .svn |xargs rm -rf

Bu, bir dizini diğerine kopyalar (böylece özyinelemeli seçenek -r) ve sonra adlandırılan her şeyi özyineli olarak siler .svn(büyük / küçük harf durumu yoksayılır).


1

Katran ve dışlama mekanizmasını kullanarak farklı bir yoldan giderdim.

Hedef dizinden:

tar -X excludefile -C source -f - . | tar xf -

Bu, cd'ye kaynaklanır, excludefile'da listelenenler hariç olmak üzere içeriği tartar ve ardından geçerli dizine açar.


Gerçekten zarif bir çözüm.
Nick Stinemates

daha sonra verdiğim cevapla aynı. artı hedef dizinde olmak zorunda ... :)
akira

0

Düzenlenmiş cevap : Sorun, -Rkopyalamanızı özyinelemeli ve böylece gizli dosyaları kopyalamanızdır. İşte ne kullanacağım:

find source/  -mindepth 1 -not \( -name .svn -prune \) | xargs -Iitem cp item target/

-mindepth 1Bayrak söyler findtoplevel dizini görmezden. Bu dizinin tüm içeriğini yeni bir üst düzey dizine kopyalamak istediğiniz için, bunu istemediğinizi varsayıyorum.

Chris Nava'nın cevabında söylediği gibi, SVN klasörlerinden bahsediyorsak bunu yapmanın yerleşik bir yolu var, ancak daha genel bir çözüm istediğinden bu biraz yardımcı olabilir.


Teşekkürler Telemachus, yardımcı olur. Eleştirecek deneyime sahip değilim, ancak orijinal yazımdan bu yana bana söylenenleri tekrarlayacağım. "xargs bozuk" Bana biraz daha etrafa bakmam için ilham verdiğini söyleyen bilinmeyen irc yorumcusu, bence Doug Harris'in cevabı soruna cevap veriyor. Bu, xargs'a boş karakterler kullanmasını söyler. Sanırım bu -0 anahtarı mı?
Michael Prescott

@Michael: xargsbozuk değil, ancak Unix benzeri sistemlerde varsayılan değer, içinde boşluk olan dosya adları (veya dizin adları) kullanmamaktır. Dosya adlarınızda (veya dizin adlarınızda) boşluklar veya "komik" karakterler varsa, bununla başa çıkmak için fazladan iş yapmanız gerekir. ( GNU'da, bu sorun nedeniyle sayfada "UNUALUAL FILENAMES" adlı findbir bölüm var man.) Bu sorunların üstesinden gelmek ve yardım etmek için -0işaret . Bununla birlikte, kopyalama komutunuzda kullanmak istemediğiniz konusunda size söz veriyorum . SVN dizinlerinden kaçınmak için yaptığınız her şeyi geri alır. xargs-print0find-R
Telemachus

0

Sanırım ağacınızın ne kadar büyük olduğuna bağlı, ama neden sadece önce her şeyi kopyalamıyorsunuz , daha sonra .svn klasörlerini kırpıyorsunuz:

find /dest-dir -type d -name .svn -exec rm -rf {} \;

?


Hiçbir kıyaslama olmadan, ilk düşüncem bunun CPU döngülerinin iki katı bir atık olduğu: kopyalama ve kaldırma. Doğru findkomutu yapmak biraz fazla zaman alabilir , ancak bunu yalnızca bir kez yaparsınız. Doğru yaptıktan sonra komutu yüzlerce kez kullanabilirsiniz.
Telemachus

@Telemachus - true, ancak bilgisayarların iyi olduğu şey budur - zor şeyleri yapmak bu yüzden yapmak zorunda değiliz! Gerçekten - bazı dosyaların kopyalanmasının sadece kısa bir süre sonra silinmesi için ne zararı var, eğer yapmak için icat ettiğiniz komutlar çok basitse?
Steve Folly

@Steve: Gerçekten bir zararı yok. Gittiği sürece, bu iyi bir çözüm. Sevdiğim bir prensibi takip ediyor: "İşe yarayan mümkün olan en basit şeyi yapın." Öte yandan, daha çok sevdiğim başka bir ilkeyi ihlal ediyor: "Araçlarınızı öğrenin." Kendimi finddaha iyi nasıl kullanacağımı öğrenmeyi tercih ederim , böylece bunu yapmak zorunda kalmadım. Ama haklısın: Bu çözümde gerçekten yanlış bir şey yok.
Telemachus

@Telemachus: "Aletlerinizi öğrenin" fikrine katılıyorum. Başladığımda, yukarıdaki bulma komutumun bana çok şifreli görüneceğinden eminim :-)
Steve Folly


0

Bunun tersini de yapabilirsiniz. Her şeyi kopyalayın ve aşağıdaki komutu kullanarak .svn klasörlerini silin:

find . | grep ".svn" | xargs rm -rf
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.