Як rsync над ssh, коли в іменах каталогу є пробіли


71

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

Ось деталі

Локальний каталог є

mnt/xlses/split/v2/name with space

Віддалений каталог є

mnt/xlses/split/v2/name with space

Я спробував усе, що можу знайти останню спробу

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ root@myserver.com:/mnt/xlses/split/v2/"name with space"

коли це запускається перше, про що він повідомляє, це створення нового каталогу

Я перериваю його і бачу, що є новий каталог

mnt/xlses/split/v2/name

всі мої файли знаходяться в цьому каталозі

Я очікував, що вони будуть

mnt/xlses/split/v2/name with space

Відповіді:


8

Спробуйте

rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space root@myserver.com:/mnt/xlses/split/v2/

Я зняв останню косу рису /з контуру до вихідного каталогу. Це дозволить rsyncскопіювати каталог та весь його вміст, а це означає, що ви rsyncбудете турбуватися про те, щоб правильно вказати ім’я на віддаленому хості (що воно буде) замість вас.


9
Це не спрацювало для мене, але відповідь JohnLate зробила.
Адріан Тісселінг

Це не пояснює, як поводитися з пробілами на віддаленій стороні.
ckujau

це не працює, як зазначалося.
Лізардкс

128

Спробуйте

rsync --protect-args --size-only -avzPe ssh  "/mnt/xlses/split/v2/name with space/ "root@myserver.com:/mnt/xlses/split/v2/name with space"

Від man rsync:

-s, --protect-args

Ця опція надсилає всі назви файлів і більшість параметрів на віддалений rsync, не дозволяючи віддаленій оболонці інтерпретувати їх. Це означає, що пробіли не розділені в іменах, і будь-які спеціальні символи, що не підміняються символом, не перекладаються (наприклад, ~, $,;; і т.д.). Підстановочні знаки розширюються на віддаленому хості rsync (замість цього робить оболонка). [...]


13
Це не працює для Mac.
Метт Олександр

8
Працює на Mac, якщо встановити останню версію rsync за допомогою домашньої заварки.
Адріан Тісселінг

4
Перевірте, чи він у вашій версії rsync, запустивши man rsyncта шукаючи ( /s) для "--protect". Щоб встановити з домашньою мовою: brew install homebrew/dupes/rsyncЯкщо не знайдено, запустіть brew search rsync.
MikeiLL

12
Встановлення нової версії не потрібне, ви просто rsync -Pavuz 'you@host:~/file\ with\ spaces' ./
уникнете

Це має бути прийнятою відповіддю.
Джош М.

38

Це працює в bash: Втечі пробіли за допомогою косої риски, а потім використовуйте лапки:

rsync -avuz me@some.server.com:"/media/Music/Heavy\ Metal/Witch\ Mountain/*" .

Або якщо у вас є шлях до змінної $ remote_path, пробіли можна уникнути заміною:

rsync -avuz me@some.server.com:"${remote_path// /\\ }" .

1
Це працювало для мене. Врятувало мене від необхідності працювати на сервері Mac.
Джордж

1
Це має бути позначено правильною відповіддю. Ключовим є те, що вам потрібні як зворотні риси, так і котирування.
Шрідхар Сарнобат

4
Подвійний втечу - це біль, -sваріант працює на будь-якій сучасній версії rsync і покликаний вирішити цю проблему
Марк К Коуан

Примітка . Якщо ви копіюєте з віддаленого сервера пробіл до місцевого шляху з простором, вам потрібно лише додати лапки до віддаленого шляху .
lenooh

Для мене працювало рішення від @teekarna. Відповідно до чоловічої сторінки "rsync", альтернативою є використання "--protect-args" або "-s" - що теж працювало для мене.
Кішань Парех

14

Використовуйте дві пари цитат

Не турбуйтеся з усією зворотною косою рисою, просто використовуйте одинарні пропозиції в подвійних лапках :

ssh me@myserver.com:"'/home/me/test file'" .

Ви також можете використовувати зворотні, тобто подвійні лапки всередині одиничних лапок :

ssh me@myserver.com:'"/home/me/test file"' .

Додаткова інформація

Підстановочні карти на стороні сервера

Якщо ви хочете, *щоб інтерпретація виконувалася на сервері, а не на клієнті, *необхідно ввести лише одну з двох пар цитат. Я вважаю це протиінтуїтивно зрозумілим, оскільки логічно зовнішня пара цитат уникає інтерпретації клієнта, тоді як внутрішня пара цитат уникає інтерпретації сервера.

Захистіть арг

Перевага порівняно з --protect-argsрішенням полягає в тому, що ви фактично не маєте обмежень --protect-args, тому ви можете використовувати спеціальні символи, такі як ~або$ . Тож ви можете написати:

rsync host:'"$HOME/test file"' .

або

rsync host:'~"/test file"' .

Зауважте, що тильда ( ~) в останньому прикладі повинна бути поза подвійними лапками.

Ви можете поставити одну з пар лапок навколо всього ім'я користувача @ host: файлова частина (наприклад ssh "me@myserver.com:'/home/me/test file'" .)


Насправді ваша пропозиція взагалі не ставити хост-частини в лапки є більш проникливою, тому спокусливо зробити це першим рядком у публікації.
Шрідхар Сарнобат

2
Це рішення геніальне! Працював так, як це було на тині з rsync над ssh.
Ікон

Якщо ви подумаєте про це, дві пари лапок є цілком логічними: зовнішня пара лапок є такою, що клієнт розглядає її неподільно (вміст яких передається серверу дослівно), а внутрішня пара лапок - для сервера визнати неподільність.
Шрідхар Сарнобат

Ця відповідь занижена.
Дерпле

6

Я розумію, що це давнє запитання, але я думав, що я доповнив би наявний масив знань.

Я використовував rsyncдекілька папок з простором, і це працює. У мене папки з номером від 1 до 10:

  • The\ Folder1
  • The\ Folder2
  • The\ Folder3
  • ..
  • The\ Folder10

Два екземпляри, які ви хочете використовувати, rsync- це локальний та віддалений.

  1. Місцеві - відзначте відсутність лапок.

    rsync -avu /media/data/The\ Folder* .
    
  2. Віддалений - відзначте наявність лапок

    rsync -avu -e ssh you@domain.com:"/media/data/The\ Folder*" .
    

3

Взагалі, цитуйте аргумент і уникайте пробілів у аргументі. У наведеному прикладі спробуйте:

rsync --size-only -avzPe ssh  "/mnt/xlses/split/v2/name\ with\ space/" "root@myserver.com:/mnt/xlses/split/v2/name\ with\ space"

1

Від rsyncпосібників:

   If you need to transfer a filename  that  contains  whitespace,  you  can
   either  specify  the --protect-args (-s) option, or you'll need to escape
   the whitespace in a way that  the  remote  shell  will  understand.   For
   instance:

          rsync -av host:'file\ name\ with\ spaces' /dest

0

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

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

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ root@myserver.com:/mnt/xlses/split/v2/name*

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

Зрештою, мені потрібно зрозуміти, як налаштувати віддалений сервер, щоб він міг ефективніше розбирати ім'я шляху - я ніколи не використовую пробіли в іменах каталогу, але людина, яка це налаштувала, зробила, і принаймні зараз я застряг


Ваша пропозиція працює лише тому, що ви вже створили каталог призначення під час першої (невдалої) спроби. Дивіться мою відповідь на більш простий спосіб (що також має перевагу не покладатися на невдалу першу спробу :).
dg99

Ну насправді каталог вже існував. Ви неправі в моїй невдалій спробі, вона створила каталог / ~ / ім'я не / ~ / ім'я з пробілом Я видалив / ~ / ім'я та продовжував пробувати різні параметри. Каталог / ~ / ім'я з пробілом існував уже я намагався додати файли до неї
PyNEwbie

О, я бачу, що ти маєш на увазі.
dg99

Працює, якщо ви цитуєте хост / шлях, а також вибираєте пробіли.
ocodo

0

Залежно від ситуації, швидким варіантом є створення симпосилання на віддаленій системі:

user@remote$ ln -s ~/name\ with\ space/ ~/name_with_space

Потім використовуйте -Lпрапор, в rsyncякому вказано, щоб він слідкував за вмістом каталогу:

user@local$ rsync -avz -L user@remote:~/name_with_space/ ~/name\ with\ space

Мені подобається мислення, бувають випадки, коли синглінг обходить клопоти поганого називання або зайвих складних ієрархій.
Шрідхар Сарнобат

0
rsync /mnt/xlses/split/v2/name\\\ with\\\ space/ root@myserver.com:/mnt/xlses/split/v2/name\\\ with\\\ space

подвійний втечу теж працює


-1

Спробуйте таким чином:

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.