Как к rsync по ssh, когда имена каталогов имеют пробелы

  1. a | b подключения STDOUT от a и STDIN от b только при помощи dup/dup2. Обе команды выполняются параллельно.

  2. a =(b) заменяет аргумент a с временным именем файла. b будет выполняться прежде a поскольку временный файл должен быть создан, прежде чем он сможет быть передан a

  3. a <(b) заменяет аргумент a с именованным каналом. a и b выполненный параллельно. Это теперь, где это становится немного сложным:

    b в фоновом режиме и не может читать из терминала. Можно протестировать его сами при помощи strace -p $PID для присоединения к второй кошке обрабатывают для наблюдения процесса.

    a тем временем попытки читать из именованного канала, но ничего не могут считать как как b не можете прочитать.

    • Это означает, что у Вас в основном есть мертвая блокировка где a попытки читать из b но b не может читать из STDIN и не может записать в a

  4. Больше информации о фоновом процессе и терминале от удара человека:

    Для упрощения реализации пользовательского интерфейса к управлению заданиями операционная система поддерживает понятие текущего терминального идентификатора группы процесса. Члены этой группы процесса (обрабатывает, чей идентификатор группы процесса равен текущему терминальному идентификатору группы процесса) получают сгенерированные клавиатурой сигналы, такие как SIGINT. Эти процессы, как говорят, находятся на переднем плане. Фоновые процессы - те, идентификатор группы процесса которых отличается от терминала; такие процессы неуязвимы для сгенерированных клавиатурой сигналов. Только приоритетным процессам позволяют читать из или, если пользователь так указывает с stty tostop, запишите в терминал. Фоновые процессы, которые пытаются читать из (пишут в то, когда stty tostop в действительности) терминал отправляется SIGTTIN (SIGTTOU) сигнал терминальным драйвером ядра, который, если не поймано, приостанавливает процесс.

76
25.11.2018, 17:04
11 ответов

Попробовать

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

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

8
27.01.2020, 19:31
  • 1
    Это не работало на меня, но ответ johnLate сделал. –  Adriaan Tijsseling 09.02.2015, 18:17
  • 2
    Это не объясняет, как иметь дело с пробелами на удаленной стороне. –  ckujau 22.09.2017, 00:36

Хорошо я собираюсь ответить на этот вопрос сам, хотя кто-то еще мог бы сделать лучшее задание объяснения его.

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

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

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

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

0
27.01.2020, 19:31
  • 1
    Ваше предложение только работает, потому что Вы уже создали целевой каталог во время своей первой (неудачной) попытки. См. мой ответ для более легкого пути (который также имеет преимущество не доверия неудавшейся первой попытке :). –  dg99 11.12.2013, 01:02
  • 2
    Хорошо на самом деле каталог уже существовал. Вы не корректны в моей неудачной попытке, она создала каталог / ~ / имя не / ~ / имя с Пространством, которое я удалил / ~ / имя и продолжал пробовать различные варианты, каталог / ~ / имя с пространством уже существовал, я пытался добавить файлы к ней, –  PyNEwbie 11.12.2013, 01:21
  • 3
    О, я вижу то, что Вы имеете в виду. столбцы –  dg99 11.12.2013, 02:12
  • 4
    Работы, если Вы заключаете хост/путь в кавычки, а также выходите из пробелов. –  ocodo 11.12.2015, 11:34

Попробуйте так:

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
-1
27.01.2020, 19:31

Попробуйте

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 (вместо оболочки). [...]

139
27.01.2020, 19:31

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

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

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

rsync -avuz me@some.server.com:"${remote_path// /\\ }" .
39
27.01.2020, 19:31

В зависимости от ситуации можно быстро создать символическую ссылку в удаленной системе:

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
27.01.2020, 19:31

Как правило, заключайте аргумент в кавычки и экранируйте символы пробела в аргументе. В приведенном вами примере попробуйте:

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

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

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

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

Два варианта использования rsync - локальный и удаленный.

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

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

    rsync -avu -e ssh you@domain.com:"/media/data/The\ Folder*" .
    
6
27.01.2020, 19:31
rsync /mnt/xlses/split/v2/name\\\ with\\\ space/ root@myserver.com:/mnt/xlses/split/v2/name\\\ with\\\ space

двойной escape тоже работает

0
27.01.2020, 19:31

Из справочных страниц 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
4
27.01.2020, 19:31

В macOS мне приходилось экранировать первый путь в обычном режиме , а второй путь экранировался + кавычки . Пример:

rsync -avhu VirtualBox\ VMs/Windows\ 10 bob@192.168.1.42:"/Users/bob/VirtualBox\ VMs/"

Это единственная комбинация , которая работала с пробелами в macOS. Обе машины Mac.

1
15.08.2020, 11:40

Теги

Похожие вопросы