Bir dizini farklı bir isimle yeni bir dizine nasıl bağlayabilirim?


48

Veri aktarımı yapıyorum, eski dosya sistemi şimdi farklı yolda olan bir dizine derinden dayanıyor. Bu çevrimiçi kod depolayan bir git dizinidir. Taşıma veya yeniden adlandırma hakkım yok.

Yani, yapabileceğim şey bu dizini aynı eski yola yönlendirmek. Ancak dizin adı da değişti.

Bir dizini farklı bir ada sahip bir hedef dizine rsync yapmamın kolay bir yolu var mı?

Yanıtlar:


82

rsyncTekrarlayan şekilde destdizini , dizinin tam bir kopyası yapmak için kullanmak istiyorsanız src:

rsync -a src/ dest

rsyncBunun nasıl adam sayfası açıklıyor:

[...] kaynağındaki sondaki eğik çizgi [s] hedefe ek bir dizin düzeyi oluşturmaktan kaçınır. /Bir kaynağın izini "dizinin ismine göre kopyala" ifadesinin aksine "bu dizinin içeriğini kopyala" olarak düşünebilirsiniz. [...]


3
Bu yaratacak srcaltında dizin destdizinine
Zen

7
@Zen, rsynchiç kullandığım hiçbir sürümünde değil . Bu gerçekten sana oluyorsa, kaynak dizin argümanının sonunda sondaki eğik çizgiyi kaçırıyorsun.
Adrian

3
O sinsi sondaki eğik çizgi KEY ...
tutuca

eğer ne yazık ki bu işin görünmüyor destbir symlnk olan srcyerine kopyalama biter srckadar src/src. MacOS'ta test edilmiştir. Ben yerini umuyorum bar -> foo/ile bar/ancak bir ara geçici dizini kullanmak zorunda kaldı.
kullanıcı5359531

@ user5359531 Eğer biliyorsanız destsembolik köprü ise src, basitçe rm destyukarıdaki komutu çalıştırmadan önce. içeriğini kopyalamadan önce rsyncoluşturmak için yeterince akıllı . Bir ara sıcaklık dir'ine gerek yok. destsrc
Adrian,

1

Eski ve yeni dosya sistemlerinin her ikisi de makinenize erişebiliyorsa, rsync yerine sembolik bir bağlantı kullanmayı düşünün. Kullanmakta olduğunuz rsync komutunuz ana bilgisayarları belirtmiyorsa (veya aynı ana bilgisayarsalarsa), durum budur. Aynı ana bilgisayarda iki dizini farklı bir adla yansıtmaya çalışıyorsunuz. Bunun için rsync'i kullanmayın, çünkü verileri kopyalarsınız ve senkronize olmalarını sağlamak için rsync'inizi sık sık çalıştırmanız gerekir.

Sembolik bir bağlantı kullanmak, iki dizini (farklı adlara sahip) yansıtacak ve neredeyse hiç boşluk gerektirmeyen tek seferlik bir düzeltmedir. Başka bir dizine işaret eden bir diğer ad dizini oluşturmak gibi.

Diyelim ki eski git / old / path / old_git adlı bir dizinde kaldı ve şimdi kod deposu / new / path / new_git dizinine taşındı.

Yapabilirsin:

cd /old/path
rm -rf old_git     (if you still have it there, get rid of it, or move it out of the way)  
ln -s /new/path/new_git old_git

Bu gibi bir link yaratacaktır:

/ old / path / old_git -> / yeni / yol / new_git

Böylece, new_git'in içine yerleştirilen herhangi bir şey, veri kopyalanmadan ve sürekli olarak senkronize edilmek zorunda kalmadan, eski yöntemlerle de anında kullanılabilir olacak.


1
Rm -rf old_git komutuna dikkat edin. Bu, tüm old_git deponuzu kaldıracaktır. Sorununuzu doğru anlamıyorsam, bu kötü bir şey olabilir.
08

0

Şimdi alternatif bir çözüm buluyorum.

Kullanma rysnc -r /origin/* /target/, tüm içerikleri başlangıç ​​dizininden hedef dizine senkronize edebilir.


8
Bunun nokta (.foo) dosyaları içermediğine inanıyorum çünkü bunlar yıldız işareti ile eşleşmeyecek
Ray Burgemeestre

Bu, glob genişlemesine dayanan bir tekniktir, teknik olarak rsync argümanı olarak bulunan her dosyayı iletir. Neredeyse koşmakla aynı rsync -r $(find /origin -maxdepth 1 -type f) /target/ . @ RayBurgemeestre'nin işaret ettiği gibi, kabuk küresi genişlemesi nokta dosyaları içermez.
Florian Castellane
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.