Você provavelmente precisa escapar desse personagem. Da página man do bash
A non-quoted backslash (\) is the escape character. It preserves the literal value of the next character that follows, with the exception of <newline>.
Estou sincronizando um diretório que contém vários documentos. Usuários que inserem documentos com todos os tipos de caracteres estranhos em seus nomes de arquivos. Eu preciso sincronizar esses arquivos de um local no Linux para outro. Muitas vezes, apenas um único arquivo precisa ser atualizado. Quando o nome do arquivo contém uma única citação, ele croaks. Eu preciso especificar usuário @ servidor para o destino, caso contrário, funciona. Por exemplo:
rsync --rsh=ssh "zz/joe's change.txt" "/somedir/y/joe's change.txt"
funciona.
rsync --rsh=ssh "zz/joe's change.txt" user@server:"/somedir/y/"
também funciona.
Mas o formulário que desejo usar:
rsync --rsh=ssh "zz/joe's change.txt" user@server:"/somedir/y/joe's change.txt"
falha com:
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)
Eu poderia usar o segundo formulário (a menos que algum nut coloque um 'no nome do diretório), mas realmente queira usar o terceiro formulário.
Você provavelmente precisa escapar desse personagem. Da página man do bash
A non-quoted backslash (\) is the escape character. It preserves the literal value of the next character that follows, with the exception of <newline>.
Nesse caso, o que finalmente funcionou para mim foi usar o argumento --protect-args
ou -s
e, depois, colocar a coisa toda entre aspas da seguinte forma:
rsync -s --rsh=ssh "zz/joe's change.txt" "user@server:/somedir/y/joe's change.txt"
Observe que até mesmo o controle remoto server
e user
também estão abaixo das aspas.
Gleb me colocou no caminho certo. Eu tinha tentado escapar dentro das aspas (junto com outras variações de citar e escapar do destino) e isso não funcionou.
Eu já voltei e descobri que funcionaria com o dobro de escape do destino:
rsync --rsh=ssh "zz/joe's change.txt" user@server:/somedir/y/joe\\'s\\ change.txt
ou
rsync --rsh=ssh zz/joe\'s\ change.txt user@server:/somedir/y/joe\\'s\\ change.txt
Tente:
rsync --rsh=ssh "zz/joe's change.txt" "user@server:/somedir/y/joe's change.txt"
O "é um sinal para o shell e pode não funcionar como parte de um argumento.