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 ael5105@192.168.0.200:'/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 ...


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 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
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 user@example.com:'$(ls -t | head -1)' .obtenir le fichier le plus récemment créé sur le serveur, ou scp user@example.com:'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.


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.


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.


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 user@example.com:"'$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 user@example.com:"$file"

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"

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.