Comment puis-je échapper les espaces dans le chemin pour la copie scp sous Linux?

307

Je suis nouveau sur linux, je veux copier un fichier d'un système distant vers un système local ... maintenant j'utilise la commande scp dans le système linux .. J'ai des noms de dossiers ou de fichiers avec des espaces, quand j'essaye de copier ça fichier, il affiche le message d'erreur: "Aucun fichier ou répertoire"

J'ai essayé:

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

J'ai vu quelques références en ligne mais je ne comprends pas parfaitement, quelqu'un peut-il m'aider à ce sujet?

comment puis-je échapper des espaces dans les noms de fichiers ou de répertoires pendant la copie ...

AlexPandiyan
la source
Non ne marche pas !! le font déjà ..
AlexPandiyan
Vérifiez que le fichier existe vraiment. Mettez les guillemets sur tout le chemin, y compris le nom de connexion et l'adresse IP. Vous pouvez également éloigner les guillemets et ajouter à la place l'espace avec une barre oblique inverse.

Réponses:

491

Fondamentalement, vous devez l'échapper deux fois, car il s'est échappé localement puis à l'extrémité distante.

Il y a quelques options que vous pouvez faire (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
la source
11
C'est assez mineur, mais sur un Mac et dans la plupart des applications de console comme Terminal, il y a une option 'Coller le texte échappé'. J'ai donc utilisé la deuxième option.
Sacrilicious
3
'"chemin"' a fonctionné alors que "'chemin'" a échoué; conclusion guillemets simples d'abord, puis les guillemets doubles à entourer
7
Hou la la! C'est probablement le comportement de programme le plus ridicule que j'ai vu!
jankes
2
@jankes Ce n'est pas sans mérite. Le fait que ce que vous y mettez soit un argument de commande shell vous permet de faire des choses comme scp [email protected]:'$(ls -t | head -1)' .obtenir le fichier le plus récemment créé sur le serveur, ou scp [email protected]:'dir/*.{xml,pdf}' .obtenir tous les fichiers xml et pdf à partir d'un répertoire distant. En général, je préfère cela à la commodité des fichiers qui ont des espaces. Les fichiers avec des espaces sont toujours un problème.
JoL
1
pourquoi c'est échapper 2 fois? un moyen de changer ce comportement?
Fractale
76

travaux

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

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

ne marche pas

scp localhost:'f/a b c' .

La raison en est que la chaîne est interprétée par le shell avant que le chemin d'accès ne soit transmis à la commande scp. Donc, quand il arrive à la télécommande, la télécommande recherche une chaîne avec des guillemets non échappés et elle échoue

Pour voir cela en action, démarrez un shell avec les options -vx c'est bash -vx-à- dire et il affichera la version interpolée de la commande lors de son exécution.

Vorsprung
la source
Utiliser des guillemets simples et s'échapper a fonctionné pour moi mais pas des guillemets doubles
Mauricio Trajano
1
@MauricioTrajano jetez un œil à gnu.org/software/bash/manual/html_node/Quoting.html toutes les citations font des choses différentes. Dans le cas simple ci-dessus, double "ou simple, 'travailler de la même façon
Vorsprung
34

Vous pouvez également faire quelque chose comme:

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

Le premier niveau de guillemets sera interprété par scp, puis le deuxième niveau de guillemets conservera les espaces.

MattK
la source
4
Cette réponse est sous-estimée, compte tenu du nombre d'espaces qu'elle peut gérer avec le même nombre de caractères d'échappement. Merci!
Michael
20

Utilisez 3 barres obliques inverses pour échapper les espaces dans les noms des répertoires:

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

devrait copier dans votre Downloadsrépertoire à filepartir du répertoire distant appelé directory with spaces.

Chris
la source
C'est le seul qui a fonctionné pour moi sur Ubuntu 19.10. Pas de guillemets doubles, pas de guillemets doux et durs dans et hors, pas de guillemets échappés. Seuls les espaces triplesbackslashed. Très étrange. Je vous remercie!
uldics
9

J'ai eu beaucoup de mal à faire fonctionner cela pour une variable shell contenant un nom de fichier avec des espaces. Pour une raison quelconque, en utilisant

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

comme dans la réponse de @ Adrian semble échouer.

Il s'avère que ce qui fonctionne le mieux est d'utiliser une extension de paramètre pour ajouter des barres obliques inverses aux espaces , comme suit.

file="foo bar/baz"
file="${file//\ /\\\ }"
scp [email protected]:"$file"
Luke Davis
la source
Je suggérerais l'expansion plus robuste de `` tout remplacer '': file="${file//\ /\\\ }"
troyfolger
J'ai oublié cette distinction - je suis rouillé sur mes extensions de paramètres. Merci!
Luke Davis
Je n'avais pas de variable mais cela m'a satisfait comme une bonne alternative à 3 barres obliques inverses pour un chemin avec beaucoup d'espaces. Personne n'a le temps pour ça!
Robert Dundon
1

Désolé d'utiliser cette question Linux pour mettre cette astuce pour Powershell sur Windows 10: le caractère spatial s'échappant avec des barres obliques inverses ou entourant de guillemets ne fonctionnait pas pour moi dans ce cas. Pas efficace, mais je l'ai résolu en utilisant le "?" char à la place:

pour le fichier "tasks.txt Jun-22.bkp" Je l'ai téléchargé en utilisant "tasks.txt? Jun-22.bkp"

Vitor Pepicon
la source