Назад | Перейти на главную страницу

заставить rsync обрабатывать отдельные файлы с одинарными кавычками в них

Я синхронизирую каталог, в котором есть куча документов. Пользователи, которые вводят документы со всевозможными странными символами в именах файлов. Мне нужно синхронизировать эти файлы из одного места в Linux в другое. Часто нужно обновлять только один файл. Когда имя файла содержит одинарные кавычки, оно хрипит. Мне нужно указать user @ server в качестве места назначения, иначе это сработает. Например:

rsync --rsh=ssh "zz/joe's change.txt" "/somedir/y/joe's change.txt"

работает.

rsync --rsh=ssh "zz/joe's change.txt" user@server:"/somedir/y/"

тоже работает.

Но форма, которую я хочу использовать:

rsync --rsh=ssh "zz/joe's change.txt" user@server:"/somedir/y/joe's change.txt"

не работает с:

bash: -c: line 0: unexpected EOF while looking for matching `''
bash: -c: line 1: syntax error: unexpected end of file
rsync: connection unexpectedly closed (0 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(165)

Я мог бы использовать вторую форму (если только какой-нибудь орех не поставит 'в имени каталога), но действительно хочу использовать третью форму.

В этом случае у меня наконец сработало использование --protect-args или -s аргумент, а затем взяв все это в кавычки следующим образом:

rsync -s --rsh=ssh "zz/joe's change.txt" "user@server:/somedir/y/joe's change.txt"

Обратите внимание, что даже пульт server и user также находятся в кавычках.

Вероятно, вам нужно сбежать от этого персонажа. Со страницы руководства bash

Обратная косая черта (\) без кавычек - это escape-символ. Он сохраняет буквальное значение следующего за ним символа, за исключением <newline>.

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

Теперь я вернулся и обнаружил, что он будет работать, дважды экранируя пункт назначения:

rsync --rsh=ssh "zz/joe's change.txt" user@server:/somedir/y/joe\\\'s\\\ change.txt

или

rsync --rsh=ssh zz/joe\'s\ change.txt user@server:/somedir/y/joe\\\'s\\\ change.txt

Пытаться:

rsync --rsh=ssh "zz/joe's change.txt" "user@server:/somedir/y/joe's change.txt"

Символ "является сигналом оболочки" и может не работать как часть аргумента.