Как выполнить 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
PyNEwbie
источник

Ответы:

8

Пытаться

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

Я снял косую черту /с пути к исходному каталогу. Это заставит rsyncскопировать каталог и все его содержимое, что rsyncбудет означать, что вы получите правильное имя на удаленном хосте (что будет) вместо вас.

dg99
источник
9
Это не сработало для меня, но ответ от johnLate сработал.
Адриан Тайсселинг
Это не объясняет, как обращаться с пробелами на удаленной стороне.
ckujau
это не работает, как отмечалось.
Lizardx
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 (вместо оболочки, делающей это). [...]

johnLate
источник
13
Это не работает для Mac.
Мэтт Александр
8
Работает на Mac, если вы устанавливаете последнюю версию rsync, используя home-brew.
Адриан Тайсселинг
4
Посмотрите, есть ли это в вашей версии rsync, запустив man rsyncи выполнив поиск ( /s) для "--protect". Для установки с помощью homebrew: brew install homebrew/dupes/rsyncЕсли не найдено, запустите brew search rsync.
MikeiLL
12
Новая версия установки не требуется, просто избежать пробелов и процитировать хост / имя файла - напримерrsync -Pavuz 'you@host:~/file\ with\ spaces' ./
ocodo
Это должен быть принятый ответ.
Джош М.
39

Это работает в bash: выйдите из пробелов с помощью обратной косой черты, а затем используйте кавычки:

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

Или, если у вас есть путь в переменной $ remote_path, пробелы могут быть экранированы заменой:

rsync -avuz me@some.server.com:"${remote_path// /\\ }" .
teekarna
источник
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"' .

Дальнейшая информация

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

Если вы хотите, чтобы a *интерпретировался на сервере, а не на клиенте, он *должен входить в одну из двух пар кавычек. Я нахожу это нелогичным, потому что логически внешняя пара кавычек избегает интерпретации клиента, в то время как внутренняя пара кавычек избегает интерпретации сервера.

Защити Аргс

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

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

или же

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

Обратите внимание, что tilde ( ~) в последнем примере должна быть вне двойных кавычек.

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

Шридхар Сарнобат
источник
На самом деле, ваше предложение вообще не помещать часть узла в кавычки более проницательно, поэтому заманчиво сделать это первой строкой в ​​посте.
Шридхар Сарнобат
2
Это блестящее решение! Работал как было на жестяной банке с rsync поверх ssh.
Икон
Когда вы думаете об этом, две пары кавычек совершенно логичны: внешняя пара кавычек такова, что клиент обрабатывает ее неделимо (содержимое которой передается на сервер), а внутренняя пара кавычек предназначена для сервера. признать неделимость
Шридхар Сарнобат
Этот ответ недооценен.
Дерпл
6

Я понимаю, что это старый вопрос, но я думал, что добавлю к существующей совокупности знаний.

Я использовал rsyncс несколькими папками с пространством, и это работает. У меня есть папки с номерами от 1 до 10 следующим образом:

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

2 экземпляра, которые вы хотели бы использовать, rsyncявляются локальными и удаленными.

  1. Местный - обратите внимание на отсутствие кавычек.

    rsync -avu /media/data/The\ Folder* .
    
  2. Remote - обратите внимание на наличие кавычек

    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*

Это работает для меня, потому что есть только один каталог, который начинается с имени, если у меня было несколько каталогов, это не будет работать.

В конечном итоге мне нужно понять, как настроить удаленный сервер так, чтобы он мог более эффективно анализировать имя пути - я никогда не использую пробелы в именах каталогов, но человек, который это настраивал, сделал, и по крайней мере на данный момент я застрял

PyNEwbie
источник
Ваше предложение работает только потому, что вы уже создали каталог назначения во время первой (неудачной) попытки. Смотрите мой ответ для более простого способа (который также имеет то преимущество, что не полагается на неудачную первую попытку :).
dg99
Ну на самом деле каталог уже существует. Вы не правы в моей неудачной попытке: он создал каталог / ~ / name not / ~ / name с пробелом, который я удалил / ~ / name, и продолжал пробовать другие варианты. Каталог / ~ / name с пробелом уже существовал, я пытался добавить файлы к нему
PyNEwbie
О, я понимаю, что вы имеете в виду.
dg99
Работает, если вы цитируете хост / путь, а также экранируете пробелы.
Окодо
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/ {} \;
user94712
источник