Odpowiedzi:
Jeśli masz więcej niż ostatni katalog liści do utworzenia, możesz ssh ... mkdir -pnajpierw uruchomić osobny lub użyć --rsync-pathsztuczki, jak wyjaśniono tutaj :
rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/
Lub skorzystaj z --relativeopcji sugerowanej przez Tony'ego. W takim przypadku określasz tylko katalog główny miejsca docelowego, który musi istnieć, a nie strukturę katalogów źródła, które zostanie utworzone:
rsync -a --relative /new/x/y/z/ user@remote:/pre_existing/dir/
W ten sposób otrzymasz / pre_existing / dir / new / x / y / z /
Jeśli chcesz, aby utworzono „y / z /”, ale nie wewnątrz „nowego / x /”, możesz dodać miejsce, w ./którym chcesz --relativerozpocząć:
rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/
utworzy / pre_existing / dir / y / z /.
&&?
Zakładając, że używasz ssh do połączenia rsync, co powiesz przed wysłaniem polecenia ssh:
ssh user@server mkdir -p existingdir/newdir
jeśli już istnieje, nic się nie dzieje
rsyncbraku odpowiedzi.
sshnie jest obsługiwana i rsyncłączy się rsync daemonze zdalnym końcem.
Ta -R, --relativeopcja to zrobi.
Na przykład: jeśli chcesz wykonać kopię zapasową /var/named/chrooti utworzyć taką samą strukturę katalogów na serwerze zdalnym -R, zrobisz to.
/./w ścieżce źródłowej. Zobacz stronę podręcznika po szczegóły.
rsyncnie utworzy automatycznie katalogów, jeśli foldery docelowe nie istnieją. Westchnienie.
--relative. Może nie zrobić tego, co myślisz.
--relativew połączeniu z /./tym, czego będzie szukała większość początkujących. rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/skopiuje zawartość pulpitu na pulpit docelowy. Nie wiem, jak różnice w nazwach użytkowników mogą na to wpłynąć.
to zadziałało dla mnie:
rsync /dev/null node:existing-dir/new-dir/
Otrzymuję tę wiadomość:
skipping non-regular file "null"
ale nie muszę się martwić, że w pobliżu kręci się pusty katalog.
Nie sądzę, że możesz to zrobić jednym poleceniem rsync, ale możesz najpierw „wstępnie utworzyć” dodatkowy katalog w następujący sposób:
rsync --recursive emptydir/ destination/newdir
gdzie „emptydir” to lokalny pusty katalog (który być może trzeba będzie najpierw utworzyć jako katalog tymczasowy).
To trochę hack, ale dla mnie działa.
Twoje zdrowie
Chris
rsync /dev/null node:existing-dir/new-dir/sugestię powyżej.
Ta odpowiedź zawiera fragmenty innych odpowiedzi, ale miejmy nadzieję, że będzie ona nieco jaśniejsza, jeśli chodzi o okoliczności. Nigdy nie określiłeś, co rsyncujesz - pojedynczy wpis katalogu lub wiele plików.
Załóżmy więc, że przenosisz wpis katalogu źródłowego, a nie tylko przenosisz zawarte w nim pliki.
Powiedzmy, że masz katalog o nazwie lokalnie, data/myappdata/a pod nim jest ładunek podkatalogów. Masz data/na swojej maszynie docelowej, ale nie data/myappdata/- to jest dość łatwe:
rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
Możesz nawet użyć innej nazwy dla zdalnego katalogu:
rsync -rvv --recursive /path/to/data/myappdata user@host:/remote/path/to/data/newdirname
Jeśli przenosisz tylko niektóre pliki i nie przenosisz wpisu katalogu, który je zawiera, wykonaj następujące czynności:
rsync -rvv /path/to/data/myappdata/*.txt user@host:/remote/path/to/data/myappdata/
i utworzy myappdatadla ciebie katalog na zdalnym komputerze, w którym będziesz mógł umieścić swoje pliki. Ponownie data/katalog musi istnieć na zdalnym komputerze.
Nawiasem mówiąc, używam -rvvflagi, aby uzyskać podwójnie rozwlekłe dane wyjściowe, aby było jasne, co robi, a także niezbędne zachowanie rekurencyjne.
Chcę tylko pokazać, co otrzymuję podczas korzystania z rsync (3.0.9 na Ubuntu 12.04)
$ 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
Mam nadzieję, że to trochę wyjaśnia.
rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdataale to, co utworzyło na miejscu docelowym, to / remote / path / to / data / myappdata / myappdata /
rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
mkdir, więc używam hacka:--rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \tworzy dodatkowy plik, ale możesz go później usunąć.