Я синхронизирую каталог, в котором есть куча документов. Пользователи, которые вводят документы со всевозможными странными символами в именах файлов. Мне нужно синхронизировать эти файлы из одного места в 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"
Символ "является сигналом оболочки" и может не работать как часть аргумента.