Como escapar de espaços no caminho para a cópia scp no Linux?


307

Eu sou novo no linux, quero copiar um arquivo do sistema remoto para o local ... agora estou usando o comando scp no sistema linux .. Tenho algumas pastas ou nomes de arquivos com espaços, quando tento copiar esse arquivo, ele mostra a mensagem de erro: "Esse arquivo ou diretório não existe"

Eu tentei:

scp ael5105@192.168.0.200:'/home/5105/test/gg/Untitled Folder/a/qy.jpg' /var/www/try/

Vi algumas referências on-line, mas não entendi perfeitamente, alguém pode ajudar nisso?

como posso escapar de espaços no nome do arquivo ou no diretório durante a cópia ...


Não, não funciona !! já fazê-lo ..
AlexPandiyan

Verifique se o arquivo realmente existe. Coloque as aspas em todo o caminho, incluindo o nome de login e o endereço IP. Como alternativa, remova as aspas e anteceda o espaço com uma barra invertida.

Respostas:


491

Basicamente, você precisa escapá-lo duas vezes, porque escapou localmente e depois no lado remoto.

Existem algumas opções que você pode fazer (no bash):

scp user@example.com:"'web/tmp/Master File 18 10 13.xls'" .
scp user@example.com:"web/tmp/Master\ File\ 18\ 10\ 13.xls" .
scp user@example.com:web/tmp/Master\\\ File\\\ 18\\\ 10\\\ 13.xls .

11
Isso é bem pequeno, mas em um Mac e na maioria dos aplicativos de console como o Terminal, existe a opção 'Colar texto escapado'. Eu, portanto, usei a segunda opção.
Sacrilicious

3
'"caminho"' funcionou enquanto "'caminho'" falhou; aspas simples conclusão primeiro e depois as aspas duplas para cercar

7
Uau! Esse é provavelmente o comportamento mais ridículo do programa que eu já vi!
jankes

2
@jankes Não é sem méritos. O fato de que você coloca um argumento de comando do shell permite fazer coisas como scp user@example.com:'$(ls -t | head -1)' .obter o arquivo criado mais recentemente no servidor ou scp user@example.com:'dir/*.{xml,pdf}' .obter todos os arquivos xml e pdf de um diretório remoto. Em geral, eu prefiro isso do que ter conveniência com arquivos que possuem espaços. Arquivos com espaços são sempre um incômodo.
21418 JoL

1
por que escapar 2 vezes? alguma maneira de mudar esse comportamento?
Fractale

76

trabalho

scp localhost:"f/a\ b\ c" .

scp localhost:'f/a\ b\ c' .

não funciona

scp localhost:'f/a b c' .

O motivo é que a sequência é interpretada pelo shell antes que o caminho seja passado para o comando scp. Portanto, quando chega ao controle remoto, o controle remoto está procurando por uma sequência com aspas sem escape e falha

Para ver isso em ação, inicie um shell com as opções -vx, ou seja, bash -vxe ele exibirá a versão interpolada do comando enquanto o executa.


Usando aspas simples e escapar funcionou para mim, mas não aspas duplas
Mauricio Trajano

1
@MauricioTrajano dê uma olhada em gnu.org/software/bash/manual/html_node/Quoting.html todas as citações fazem coisas diferentes. No caso acima simples duplo "ou single 'de trabalho o mesmo
Vorsprung

34

Além disso, você pode fazer algo como:

scp foo@bar:"\"apath/with spaces in it/\""

O primeiro nível de aspas será interpretado por scp e o segundo nível preservará os espaços.


4
Esta resposta é subestimada, considerando quantos espaços ela pode manipular com a mesma quantidade de caracteres de escape. Obrigado!
Michael

20

Use 3 barras invertidas para escapar de espaços nos nomes dos diretórios:

scp user@host:/path/to/directory\\\ with\\\ spaces/file ~/Downloads

deve copiar para o seu Downloadsdiretório o filedo diretório remoto chamado directory with spaces.


Este é o único que funcionou para mim no Ubuntu 19.10. Sem aspas duplas, sem aspas e suaves dentro e fora, sem aspas escapadas. Somente tripplebackspashed space. Muito estranho. Obrigado!
uldics 21/04

9

Eu tive uma enorme dificuldade em fazer com que isso funcionasse para uma variável de shell contendo um nome de arquivo com espaço em branco. Por alguma razão, usando

file="foo bar/baz"
scp user@example.com:"'$file'"

como na resposta de @ Adrian parece falhar.

Acontece que o que funciona melhor é usar uma expansão de parâmetro para colocar barras invertidas no espaço em branco , como a seguir.

file="foo bar/baz"
file="${file//\ /\\\ }"
scp user@example.com:"$file"

Eu sugeriria a expansão mais robusta 'substitute all': file="${file//\ /\\\ }"
troyfolger

Esqueci essa distinção - estou enferrujado com minhas expansões de parâmetros. Obrigado!
Luke Davis

Eu não tinha uma variável, mas isso me satisfez como uma boa alternativa a 3 barras invertidas para um caminho com muitos espaços. Ninguém tem tempo para isso!
Robert Dundon

1

Desculpe por usar esta pergunta do Linux para colocar esta dica do Powershell no Windows 10: o caractere de espaço escapando com barras invertidas ou circundado por aspas não funcionou para mim neste caso. Não é eficiente, mas resolvi usando o "?" char em vez disso:

para o arquivo "tasks.txt Jun-22.bkp", baixei usando "tasks.txt? Jun-22.bkp"

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.