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.