¿Cómo escapo espacios en la ruta para la copia scp en Linux?

307

Soy nuevo en Linux, quiero copiar un archivo del sistema remoto al local ... ahora estoy usando el comando scp en el sistema Linux ... Tengo algunas carpetas o nombres de archivos con espacios, cuando intento copiar eso archivo, muestra el mensaje de error: "No existe tal archivo o directorio"

Lo intenté:

scp [email protected]:'/home/5105/test/gg/Untitled Folder/a/qy.jpg' /var/www/try/

Vi algunas referencias en línea pero no las entiendo perfectamente, ¿alguien puede ayudarme en esto?

¿Cómo puedo escapar de espacios en el nombre del archivo o los nombres de directorio durante la copia ...

AlexPandiyan
fuente
No no funciona !! ya lo hago ..
AlexPandiyan
Verifique que el archivo realmente exista. Ponga las comillas alrededor de toda la ruta, incluido el nombre de inicio de sesión y la dirección IP. Alternativamente, remueve las comillas y antepone el espacio con una barra invertida.

Respuestas:

491

Básicamente necesita escapar dos veces, porque se escapó localmente y luego en el extremo remoto.

Hay un par de opciones que puede hacer (en bash):

scp [email protected]:"'web/tmp/Master File 18 10 13.xls'" .
scp [email protected]:"web/tmp/Master\ File\ 18\ 10\ 13.xls" .
scp [email protected]:web/tmp/Master\\\ File\\\ 18\\\ 10\\\ 13.xls .
Adrian Gunawan
fuente
11
Esto es bastante menor, pero en una Mac y en la mayoría de las aplicaciones de consola como Terminal, existe la opción 'Pegar texto escapado'. Por lo tanto, utilicé la segunda opción.
Sacrilicious
3
'"ruta"' funcionó mientras que "" ruta "" falló; conclusión comillas simples primero y luego comillas dobles para rodear
77
¡Guauu! ¡Ese es probablemente el comportamiento de programa más ridículo que he visto!
enero
2
@jankes No tiene méritos. El hecho de que lo que pones allí es un argumento de comando de shell te permite hacer cosas como scp [email protected]:'$(ls -t | head -1)' .obtener el archivo creado más recientemente en el servidor, o scp [email protected]:'dir/*.{xml,pdf}' .obtener todos los archivos xml y pdf de un directorio remoto. En general, prefiero esto a tener comodidad con archivos que tienen espacios. Los archivos con espacios son siempre una molestia.
JoL
1
¿Por qué es escapar 2 veces? alguna forma de cambiar este comportamiento?
Fractale
76

trabajos

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

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

No funciona

scp localhost:'f/a b c' .

La razón es que la cadena es interpretada por el shell antes de pasar la ruta al comando scp. Entonces, cuando llega al control remoto, el control remoto busca una cadena con comillas sin escape y falla

Para ver esto en acción, inicie un shell con las opciones -vx, es decir, bash -vxy mostrará la versión interpolada del comando mientras lo ejecuta.

Vorsprung
fuente
Usar comillas simples y escapar funcionó para mí, pero no comillas dobles
Mauricio Trajano
1
@MauricioTrajano eche un vistazo a gnu.org/software/bash/manual/html_node/Quoting.html todas las citas hacen cosas diferentes. En el caso simple anterior, doble "o simple 'funciona igual
Vorsprung
34

También puedes hacer algo como:

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

El primer nivel de citas será interpretado por scp y luego el segundo nivel de citas preservará los espacios.

MattK
fuente
44
Esta respuesta está subestimada, considerando cuántos espacios puede manejar con la misma cantidad de caracteres de escape. ¡Gracias!
Michael
20

Use 3 barras invertidas para escapar espacios en los nombres de directorios:

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

debe copiar a su Downloadsdirectorio filedesde el directorio remoto llamado directory with spaces.

Chris
fuente
Este es el único que funcionó para mí en Ubuntu 19.10. Sin comillas dobles, sin comillas suaves y duras dentro y fuera, sin comillas escapadas. Solo trippleba los espacios reducidos. Muy raro. ¡Gracias!
Uldics
9

Tuve una gran dificultad para que esto funcione para una variable de shell que contiene un nombre de archivo con espacios en blanco. Por alguna razón usando

file="foo bar/baz"
scp [email protected]:"'$file'"

como en la respuesta de @ Adrian parece fallar.

Resulta que lo que funciona mejor es usar una expansión de parámetros para anteponer barras diagonales inversas al espacio en blanco , de la siguiente manera.

file="foo bar/baz"
file="${file//\ /\\\ }"
scp [email protected]:"$file"
Luke Davis
fuente
Sugeriría la expansión más robusta 'sustitúyelo todo': file="${file//\ /\\\ }"
troyfolger
Olvidé esa distinción: estoy oxidado en mis expansiones de parámetros. ¡Gracias!
Luke Davis
No tenía una variable, pero esto me satisfizo como una buena alternativa a 3 barras diagonales inversas para un camino con muchos espacios. ¡Nadie tiene tiempo para eso!
Robert Dundon
1

Perdón por usar esta pregunta de Linux para poner este consejo para Powershell en Windows 10: el escape de caracteres espaciales con barras invertidas o entre comillas no funcionó para mí en este caso. No es eficiente, pero lo resolví usando el "?" char en su lugar:

para el archivo "task.txt jun-22.bkp" lo descargué usando "task.txt? jun-22.bkp"

Vitor Pepicon
fuente