rsync: sunucuda hedef dizin oluşturmak için nasıl yapılandırabilirim?


144

Ben istiyorum rsyncsunucuya yerel bilgisayardan. Varolmayan bir dizinde ve önce rsynco dizini sunucuda oluşturmak istiyorum .

Bunu nasıl yapabilirim?

Yanıtlar:


162

Oluşturulacak son yaprak dizininden daha fazlasına sahipseniz, ssh ... mkdir -pönce ayrı bir dizin çalıştırabilir veya burada açıklanan şekilde --rsync-pathnumarayı kullanabilirsiniz :

rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/

Veya --relativeseçeneği Tony'nin önerdiği şekilde kullanın . Bu durumda, oluşturulacak kaynağın dizin yapısını değil, yalnızca bulunması gereken hedefin kökünü belirtirsiniz:

rsync -a --relative /new/x/y/z/ user@remote:/pre_existing/dir/

Bu şekilde / pre_existing / dir / new / x / y / z / ile sonuçlanacaksınız.

Ve "y / z /" oluşturmak, ancak "new / x /" içinde olmamak ./istiyorsanız --relative, başlamak istediğiniz yeri ekleyebilirsiniz :

rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/

/ pre_existing / dir / y / z / oluşturur.


2
Erişiyorum sunucu yok mkdir, bu yüzden kesmek kullanıyorum: --rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \ekstra bir dosya oluşturur, ancak daha sonra kaldırabilirsiniz.
Fabiano Soriani

1
Bu yeni rsync protokolleri üzerinde çalışmıyor gibi görünüyor, && veya kullanırken aşağıdakine benzer bir hata alıyorum; - scp komutunda
ghitesh

@ghitesh kaçmaya çalıştınız &&mı?
Felipe Alvarez

@FelipeAlvarez Evet, ama çalışmadım. Şimdi bağlantıyı bulamıyorum, ancak bazı belgeler bunun istismar edilebileceğine (ve kullanıldığına) inandığı için bunun sabit olduğunu söyledi.
ghitesh

Teşekkürler, bu işe yarıyor. Benim durumumda, uzak bir sunucuda yerel bir bash betiği çalıştırıyordum ve içinde çalışan ssh mkdir komutunu çalıştırıyordum, ancak daha sonra rsync komutunu çalıştırmadan önce betiğin geri kalanını öldürdüm. Bu, komut dosyasının geri kalanının sorunsuz çalışmasını sağlar.
johndavid400

33

Rsync'i bağlamak için ssh kullandığınızı varsayarsak, daha önce bir ssh komutu göndermeye ne dersiniz:

ssh user@server mkdir -p existingdir/newdir

zaten varsa hiçbir şey olmaz


4
ufk'ın isteği, "rsync'in [eksik hedef] sunucuda [&& dosyaları kopyala] dizini oluşturmasına" neden olacak sözdizimi içindir. Yanıtınız, sunucuda eksik hedef dizini oluşturacağı için geçerlidir ... ancak rsyncbu nedenle yanıt vermez.
TomRoche

sshDesteklenmiyorsa ve uzak uçtaki rsyncbağlantı noktasına bağlanırsa bu bir seçenek değildir rsync daemon.
Krzysztof Jabłoński

19

-R, --relativeSeçenek yapacağız.

Örneğin: /var/named/chrootuzak sunucuda aynı dizin yapısını yedeklemek ve oluşturmak istiyorsanız -R, bunu yapın.


12
/./Kaynak yolda kullanarak oluşturulacak yolun yalnızca bir bölümünü de belirleyebilirsiniz . Ayrıntılar için kılavuz sayfasına bakınız.
Marki555

21
Neden oy kullanmalıyım? Yanıt yanlış, rsynchedef klasörler yoksa otomatik olarak dizin oluşturmaz. İç çekmek.
zeekvfu

3
Okuyucuların bu sayfayı kontrol etmelerini şiddetle tavsiye ediyorum --relative. Düşündüğünüzü yapmayabilir.
FiloSottile

3
--relative, dosya yerine tam yolu sunucuda sağladığınız uç noktaya yapıştırır. Normalde /tmp/foo/bar/file.c uzak: / tmp uzak üretir: /tmp/file.c ama -R ile /tmp/foo/bar/file.c oluşturur. ne yaptığını bilmek, gerçekten dağınık bir dizin yapısı alacak.
Cormac Mulhall

7
@ Marki555'in yorumu başarının anahtarıdır. --relativeile birlikte /./çoğu yeni ne arayacak. rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/masaüstünün içeriğini hedef masaüstüne kopyalar. Kullanıcı adlarındaki farklılıkların bunu nasıl etkileyebileceğini bilmiyorum.
Daniel F

15

bu benim için çalıştı:

 rsync /dev/null node:existing-dir/new-dir/

Bu mesajı alıyorum:

skipping non-regular file "null"

ama etrafta boş bir dizin olması konusunda endişelenmem gerekmiyor.


Cevabınız için teşekkürler kdubs. Harika çalıştı. Yani, senkronize ettiğim dosyaları kaynak olarak işaret ettiğim klasörün içinde tutmak istersem, sadece belirtmem gerekiyor ve yaratılıyor. ex: rsync -avph / mytest / / otherfolder / mytest / Sonra çıktı "oluşturulan dizin / otherfolder / mytest"
mbrinson

1
New-dir sonunda eğik çizgiyi ('/') unutmayın, aksi takdirde dizin olmayan bir dosya oluşturur.
tartaruga_casco_mole

4

Bunu bir rsync komutuyla yapabileceğinizi düşünmüyorum, ancak ilk olarak şu şekilde ekstra dizini 'oluşturabilirsiniz':

rsync --recursive emptydir/ destination/newdir

burada 'emptydir' yerel bir boş dizindir (önce geçici bir dizin olarak oluşturmanız gerekebilir).

Biraz hack, ama benim için çalışıyor.

şerefe

Chris


Geçici klasör kullanmaya gerek yok. rsync /dev/null node:existing-dir/new-dir/Yukarıdaki öneriye bakın .
lucid_dreamer

3

Bu cevap diğer cevapların bitlerini kullanır, ancak umarım şartlara göre biraz daha açık olacaktır. Neyi rsyncing yaptığınızı hiç belirtmediniz - tek bir dizin girişi veya birden fazla dosya.

Öyleyse, sadece içindeki dosyaları taşımakla kalmayıp bir kaynak dizin girdisini de taşıdığınızı varsayalım.

Diyelim ki yerel olarak adlandırılan bir dizininiz var data/myappdata/ve bunun altında bir sürü alt dizin var. You have data/hedef makinede ama hayır data/myappdata/- bu kolay yeterlidir:

rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata

Uzak dizin için farklı bir ad bile kullanabilirsiniz:

rsync -rvv --recursive /path/to/data/myappdata user@host:/remote/path/to/data/newdirname

Yalnızca bazı dosyaları taşıyorsanız ve bunları içeren dizin girişini taşımıyorsanız, şunları yaparsınız:

rsync -rvv /path/to/data/myappdata/*.txt user@host:/remote/path/to/data/myappdata/

ve myappdatadosyalarınızı yerleştirmek için uzak makinede sizin için bir data/dizin oluşturur . Yine, dizinin uzak makinede bulunması gerekir.

Bu arada, -rvvbayrağı kullanmam iki kat ayrıntılı çıktı elde etmektir, böylece ne yaptığı ve aynı zamanda yinelenen davranışlar hakkında nettir.

Sadece rsync kullanırken ne elde ettiğimi göstermek için (Ubuntu 12.04'te 3.0.9)

$ rsync -rvv *.txt user@remote.machine:/tmp/newdir/
opening connection using: ssh -l user remote.machine rsync --server -vvre.iLsf . /tmp/newdir/
user@remote.machine's password:
sending incremental file list
created directory /tmp/newdir
delta-transmission enabled
bar.txt
foo.txt
total: matches=0  hash_hits=0  false_alarms=0 data=0

Umarım bu biraz temizler.


Bu vermez tam beklendiği gibi çalışmayabilir. İlk komutu denedim rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdataama hedefte yarattığı / remote / path / to / data / myappdata / myappdata /
harleygolfguy

İlk komutunuzda küçük bir değişiklik yapar ve kaynak yolundan sonra bir eğik çizgi '/' eklerseniz, o zaman işe rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
yarar

2

Örneğin:

from: /xxx/a/b/c/d/e/1.html

kime: user @ remote: /pre_existing/dir/b/c/d/e/1.html

rsync:

cd / xxx / a / && rsync -auvR b / c / d / e / kullanıcı @ uzaktan: / pre_existing / dir /

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.