Odpowiedzi:
Jeśli masz więcej niż ostatni katalog liści do utworzenia, możesz ssh ... mkdir -p
najpierw uruchomić osobny lub użyć --rsync-path
sztuczki, 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 --relative
opcji 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 --relative
rozpocząć:
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
rsync
braku odpowiedzi.
ssh
nie jest obsługiwana i rsync
łączy się rsync daemon
ze zdalnym końcem.
Ta -R, --relative
opcja to zrobi.
Na przykład: jeśli chcesz wykonać kopię zapasową /var/named/chroot
i 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.
rsync
nie utworzy automatycznie katalogów, jeśli foldery docelowe nie istnieją. Westchnienie.
--relative
. Może nie zrobić tego, co myślisz.
--relative
w 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 myappdata
dla 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 -rvv
flagi, 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/myappdata
ale 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ąć.