rsync: як я можу налаштувати його на створення цільового каталогу на сервері?


144

Я хотів би rsyncвід локального комп'ютера до сервера. У каталозі, який не існує, я хочу rsyncспершу створити цей каталог на сервері.

Як я можу це зробити?

Відповіді:


162

Якщо у вас є більше, ніж створений останній каталог аркушів, ви можете запустити окремий ssh ... mkdir -pспочатку або скористатися --rsync-pathтрюком, як пояснено тут :

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

Або скористайтеся --relativeопцією, запропонованою Тоні. У цьому випадку ви вказуєте лише корінь пункту призначення, який повинен існувати, а не структуру каталогів джерела, яке буде створено:

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

Таким чином, ви закінчите / pre_existing / dir / new / x / y / z /

І якщо ви хочете створити "y / z /", але не всередині "new / x /", ви можете додати ./там, де ви хочете --relativeпочати:

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

створив би / pre_existing / dir / y / z /.


2
Сервер, до якого я звертаюся, не має mkdir, тому я використовую хак: --rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \він створює додатковий файл, але його можна видалити пізніше.
— Фабіано Соріані

1
Схоже, це не працює над новішими протоколами rsync, я отримую помилку, подібну до наступної під час використання && або; в --rsync-шляху недійсні символи в команді scp! тут: && / usr / bin / rsync
— ghitesh

@ghitesh ти намагався втекти &&?
— Феліпе Альварес

@FelipeAlvarez Так, але я не працював. Зараз я не в змозі знайти посилання, але в деякій документації сказано, що це виправлено, оскільки я вважаю, що його можна було (і було) використовувати.
— ghitesh

Дякую, це працює. У моєму випадку я запускав локальний скрипт bash на віддаленому сервері і в межах цього виконував команду ssh mkdir, яку виконував, але потім вбивав решту сценарію перед тим, як запустити команду rsync. Це дозволяє виконувати решту сценарію без проблем.
— johndavid400

33

Якщо припустити, що ви використовуєте ssh для підключення rsync, що робити з тим, щоб надіслати команду ssh раніше:

ssh user@server mkdir -p existingdir/newdir

якщо вона вже існує, нічого не відбувається


4
Запит ufk призначений для синтаксису, який спричинить "rsync для створення каталогу [відсутня ціль] на сервері [& & copy the files]." Ваша відповідь справедлива в тому, що вона створить відсутній цільовий каталог на сервері ..., але не з rsyncвідповідною відсутністю відповіді.
— TomRoche

Це не варіант, якщо sshвін не підтримується та rsyncпідключається до rsync daemonвіддаленого кінця.
— Кшиштоф Яблонський

19

-R, --relativeВаріант робитиме це.

Наприклад: якщо ви хочете створити резервну копію /var/named/chrootта створити ту саму структуру каталогів на віддаленому сервері, то -Rзробите саме це.


12
Ви також можете вказати лише частину шляху, який слід створити, використовуючи /./у вихідному контурі. Детальну інформацію див. На сторінці чоловіка.
— Marki555

21
Чому виступають? Відповідь неправильна, rsyncне створюватиме каталоги автоматично, якщо цільових папок не існує. Зітхнути.
— zeekvfu

3
Я настійно пропоную читачам перевірити сторінку --relative. Це може не робити те, що ви думаєте.
— FiloSottile

3
- відносна палиця повного шляху, а не файлу, до кінцевої точки, яку ви надаєте на сервері. Зазвичай /tmp/foo/bar/file.c для віддаленого: / tmp створює віддалене: /tmp/file.c, але з -R створює /tmp/foo/bar/file.c Не використовуйте цю опцію, якщо ви не знайте, що ви робите, ви отримаєте дійсно безладну структуру каталогів.
— Кормак Малхолл

7
Коментар @ Marki555 є ключовим для успіху. --relativeу поєднанні з /./тим, що шукатиме більшість новачків. rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/скопіює вміст робочого столу на цільовий робочий стіл. Не знаю, як різниці в іменах користувачів можуть вплинути на це.
— Даніель Ф

15

це працювало для мене:

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

Я отримую це повідомлення:

skipping non-regular file "null"

але мені не доведеться турбуватися про те, щоб навколо був порожній каталог.


Дякуємо за відповідь kdubs. Це працювало чудово. Отже, якщо я хочу зберегти файли, які я синхронізую всередині папки, на яку я вказую як на джерело, тоді мені просто потрібно вказати її, і вона буде створена. Наприклад: rsync -avph / mytest / / otherfolder / mytest / Тоді я отримую вихід "створений каталог / otherfolder / mytest"
— mbrinson

1
Не забувайте нахил ('/') в кінці new-dir, інакше він створить файл без каталогу.
— tartaruga_casco_mole

4

Я не думаю, що ви можете це зробити за допомогою однієї команди rsync, але ви можете спочатку створити додатковий каталог, як це:

rsync --recursive emptydir/ destination/newdir

де 'emptydir' - це локальний порожній каталог (який, можливо, потрібно створити спочатку як тимчасовий каталог).

Це трохи хак, але це працює для мене.

ура

Кріс


Не потрібно використовувати тимчасову папку. Дивіться rsync /dev/null node:existing-dir/new-dir/пропозицію вище.
— lucid_dreamer

3

Ця відповідь використовує біти інших відповідей, але, сподіваємось, буде трохи зрозуміліше щодо обставин. Ви ніколи не вказували, що ви rsyncing - один запис каталогу або кілька файлів.

Тож припустимо, що ви переміщуєте запис вихідного каталогу впоперек, а не просто переміщуєте файли, що містяться в ньому.

Скажімо, у вас є локальний каталог, під яким data/myappdata/ви завантажуєте підкаталоги. У вас є data/цільова машина, але ні data/myappdata/- це досить просто:

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

Можна навіть використовувати інше ім’я для віддаленого каталогу:

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

Якщо ви просто переміщуєте деякі файли, а не переміщуєте запис каталогу, який містить їх, то зробите:

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

і він створить вам myappdataкаталог на віддаленій машині для розміщення ваших файлів. Знову ж цей data/каталог повинен існувати на віддаленій машині.

До речі, моє використання -rvvпрапора полягає в тому, щоб отримати подвійний багатослівний вихід, щоб було зрозуміло, що він робить, а також необхідну рекурсивну поведінку.

Просто щоб показати вам, що я отримую при використанні rsync (3.0.9 в 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

Сподіваюсь, це трохи прояснить це.


Це не зовсім працює так, як очікувалося. Я спробував першу команду, rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdataале те, що було створено для цілі, є / віддалений / шлях / до / даних / myappdata / myappdata /
— harleygolfguy

Якщо я внесу невелику зміну до вашої першої команди та додаю косу рису "/" після вихідного контуру, тоді вона працює ... так: rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
— harleygolfguy

2

наприклад:

від: /xxx/a/b/c/d/e/1.html

до: 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 /

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.