rsync: jak mogę to skonfigurować, aby utworzyć katalog docelowy na serwerze?

144

Chciałbym przenieść się rsyncz lokalnego komputera na serwer. W katalogu, który nie istnieje i chcę rsyncnajpierw utworzyć ten katalog na serwerze.

Jak mogę to zrobić?

ufk
źródło

Odpowiedzi:

162

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 /.

mivk
źródło
2
Serwer, do którego mam dostęp, nie ma 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ąć.
Fabiano Soriani
1
Wygląda na to, że to nie działa na nowszych protokołach rsync, pojawia się błąd podobny do następującego podczas używania && lub; w --rsync-path nieprawidłowe znaki w poleceniu scp! tutaj: && / usr / bin / rsync
ghitesh
@ghitesh czy próbowałeś uciec &&?
Felipe Alvarez
@FelipeAlvarez Tak zrobiłem, ale nie zadziałało. Nie mogę teraz znaleźć linku, ale w niektórych dokumentach jest napisane, że to zostało naprawione, ponieważ uważam, że można (i było) wykorzystać.
ghitesh
Dzięki, to działa. W moim przypadku uruchamiałem lokalny skrypt bash na zdalnym serwerze i w ramach tego uruchamiałem polecenie ssh mkdir, które było wykonywane, ale następnie zabiłem resztę skryptu przed uruchomieniem polecenia rsync. Dzięki temu reszta skryptu może działać bez problemów.
johndavid400
33

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

Alfredo Yong
źródło
4
Żądanie ufk dotyczy składni, która spowoduje, że „rsync utworzy [brakujący docelowy] katalog na serwerze [&& skopiuj pliki]”. Twoja odpowiedź jest prawidłowa, ponieważ utworzy brakujący katalog docelowy na serwerze ... ale nie w przypadku rsyncbraku odpowiedzi.
TomRoche
Nie jest to opcja, jeśli sshnie jest obsługiwana i rsyncłączy się rsync daemonze zdalnym końcem.
Krzysztof Jabłoński
19

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.

Tony
źródło
12
Możesz również określić tylko część ścieżki, która ma zostać utworzona, używając /./w ścieżce źródłowej. Zobacz stronę podręcznika po szczegóły.
Marki555
21
Dlaczego głosować za? Odpowiedź jest nieprawidłowa, rsyncnie utworzy automatycznie katalogów, jeśli foldery docelowe nie istnieją. Westchnienie.
zeekvfu
3
Zdecydowanie zalecam czytelnikom sprawdzenie strony podręcznika --relative. Może nie zrobić tego, co myślisz.
FiloSottile
3
--relative umieszcza pełną ścieżkę zamiast pliku w punkcie końcowym, który podasz na serwerze. Normalnie /tmp/foo/bar/file.c to remote: / tmp dałoby zdalny: /tmp/file.c, ale z -R tworzy /tmp/foo/bar/file.c Nie używaj tej opcji, chyba że wiesz, co robisz, otrzymasz naprawdę nieuporządkowaną strukturę katalogów.
Cormac Mulhall,
7
Komentarz @ Marki555 jest kluczem do sukcesu. --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ąć.
Daniel F
15

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.

kdubs
źródło
Dzięki za odpowiedź kdubs. To działało świetnie. Tak więc, jeśli chcę zachować pliki, które synchronizuję, w folderze, który wskazuję jako źródło, po prostu muszę go określić i zostanie utworzony. ex: rsync -avph / mytest / / otherfolder / mytest / Następnie otrzymuję wynik „utworzony katalog / innyfolder / mytest”
mbrinson
1
Nie zapomnij o ukośniku („/”) na końcu nowego-katalogu, w przeciwnym razie utworzy on plik niekatalogowy.
tartaruga_casco_mole
4

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

Chris Dennis
źródło
Nie ma potrzeby używania folderu tymczasowego. Zobacz rsync /dev/null node:existing-dir/new-dir/sugestię powyżej.
lucid_dreamer
3

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 [email protected]:/tmp/newdir/
opening connection using: ssh -l user remote.machine rsync --server -vvre.iLsf . /tmp/newdir/
[email protected]'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.

Żuchwa79
źródło
To nie działa dokładnie tak, jak oczekiwano. Wypróbowałem pierwsze polecenie, 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 /
harleygolfguy
Jeśli rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
dokonam
2

na przykład:

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

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

rsync:

cd / xxx / a / && rsync -auvR b / c / d / e / user @ remote: / pre_existing / dir /

Montaż
źródło