Come sfuggire agli spazi nel percorso per la copia scp in Linux?


307

Sono nuovo di Linux, voglio copiare un file dal sistema remoto al sistema locale ... ora sto usando il comando scp nel sistema Linux .. Ho alcune cartelle o nomi di file con spazi, quando provo a copiarlo file, mostra il messaggio di errore: "Nessun file o directory"

Provai:

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

Ho visto alcuni riferimenti online ma non capisco perfettamente, qualcuno può aiutarmi su questo?

come posso sfuggire agli spazi nel nome del file o dei nomi di directory durante la copia ...


No non funziona !! lo faccio già ..
AlexPandiyan l'

Ricontrolla che il file esista davvero. Inserisci le virgolette in tutto il percorso, inclusi il nome di accesso e l'indirizzo IP. In alternativa, remoto le virgolette e anteporre invece lo spazio con una barra rovesciata.

Risposte:


491

Fondamentalmente è necessario evitarlo due volte, perché è scappato localmente e quindi sul lato remoto.

Ci sono un paio di opzioni che puoi fare (in 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
Questo è piuttosto secondario, ma su un Mac e nella maggior parte delle app console come Terminal, c'è un'opzione 'Incolla testo di escape'. Ho quindi utilizzato la seconda opzione.
Sacrilicious il

3
'"percorso"' funzionava mentre "'percorso'" falliva; conclusione prima virgolette singole e poi doppie virgolette da circondare

7
Wow! Questo è probabilmente il comportamento del programma più ridicolo che abbia mai visto!
Jankes

2
@jankes Non è senza meriti. Il fatto che ciò che inserisci è un argomento del comando shell ti consente di fare cose come scp user@example.com:'$(ls -t | head -1)' .ottenere il file creato più di recente nel server o scp user@example.com:'dir/*.{xml,pdf}' .ottenere tutti i file xml e pdf da una directory remota. In generale, preferisco questo rispetto alla comodità con i file che hanno spazi. I file con spazi sono sempre un problema.
JoL

1
perché è fuga 2 volte? un modo per cambiare questo comportamento?
Fractale,

76

lavori

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

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

non funziona

scp localhost:'f/a b c' .

Il motivo è che la stringa viene interpretata dalla shell prima che il percorso venga passato al comando scp. Quindi quando arriva al telecomando il telecomando cerca una stringa con virgolette senza caratteri di escape e non riesce

Per vederlo in azione, avvia una shell con le opzioni -vx cioè bash -vxe mostrerà la versione interpolata del comando mentre la esegue.


Usando le virgolette singole e l'escaping ha funzionato per me, ma non le doppie citazioni
Mauricio Trajano,

1
@MauricioTrajano dai un'occhiata a gnu.org/software/bash/manual/html_node/Quoting.html tutte le citazioni fanno cose diverse. Nel caso semplice sopra doppio "o singolo 'lavoro lo stesso
Vorsprung

34

Inoltre puoi fare qualcosa del tipo:

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

Il primo livello di virgolette verrà interpretato da scp e quindi il secondo livello di virgolette conserverà gli spazi.


4
Questa risposta è sottovalutata, considerando quanti spazi può gestire con la stessa quantità di caratteri di escape. Grazie!
Michael,

20

Utilizzare 3 barre rovesciate per sfuggire agli spazi nei nomi delle directory:

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

dovrebbe copiare nella tua Downloadsdirectory il filedalla directory remota chiamata directory with spaces.


Questo è l'unico che ha funzionato per me su Ubuntu 19.10. Nessuna virgoletta doppia, nessuna virgoletta morbida e rigida dentro e fuori, senza virgolette sfuggite. Solo spazi tratteggiati. Molto strano. Grazie!
uldics, il

9

Ho avuto enormi difficoltà a farlo funzionare per una variabile di shell contenente un nome file con spazi bianchi. Per qualche motivo usando

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

come nella risposta di @ Adrian sembra fallire.

Si scopre che ciò che funziona meglio è usare un'espansione dei parametri per anteporre barre rovesciate allo spazio bianco , come segue.

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

Vorrei suggerire l'espansione più robusta "sostituisci tutto": file="${file//\ /\\\ }"
troyfolger il

Dimenticato questa distinzione: sono arrugginito nelle mie espansioni di parametri. Grazie!
Luke Davis il

Non avevo una variabile ma questo mi soddisfaceva come una buona alternativa a 3 barre rovesciate per un percorso con molti spazi. Nessuno ha tempo per quello!
Robert Dundon,

1

Ci scusiamo per l'utilizzo di questa domanda Linux per inserire questo suggerimento per Powershell su Windows 10: il carattere spaziale che fuoriesce con barre rovesciate o racchiuso tra virgolette non ha funzionato in questo caso. Non efficiente, ma l'ho risolto usando il "?" char invece:

per il file "task.txt giu-22.bkp" L'ho scaricato usando "task.txt? giu-22.bkp"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.