web-dev-qa-db-fra.com

Comment échapper aux espaces du chemin lors de la copie scp sous Linux?

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

J'ai essayé:

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

J'ai vu la référence en ligne mais je ne comprends pas très bien, est-ce que quelqu'un peut m'aider?

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

266
AlexPandiyan

En gros, vous devez y échapper deux fois, car il est échappé localement, puis à distance.

Il y a plusieurs 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 .
427
Adrian Gunawan

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 ne soit passé à la commande scp. Ainsi, quand il arrive à la télécommande, elle 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, à savoir bash -vx, et il affichera la version interpolée de la commande au fur et à mesure de son exécution.

64
Vorsprung

Aussi, vous pouvez faire quelque chose comme:

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

Le premier niveau de citations sera interprété par scp, puis le deuxième niveau de citations préservera les espaces.

28
MattK

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

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

devrait copier dans votre répertoire Downloads le file à partir du répertoire distant appelé directory with spaces.

6
Chris

J'ai eu beaucoup de difficulté à faire en sorte que cela fonctionne pour un variable Shell contenant un nom de fichier avec des espaces. Il s'avère que l'utilisation de

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

comme dans la réponse de @ Adrian semble échouer (essayez d'entrer set -x avant les commandes ci-dessus pour voir comment le shell interprète cette chaîne; c'est assez méchant et je ne comprends pas vraiment pourquoi il échoue).

Il s'avère que ce qui fonctionne le mieux est d'utiliser un paramètre de développement à pour ajouter des barres obliques inverses au blanc, comme suit.

file="foo bar/baz" # a file inside a directory-name with whitespace
file="${file//\ /\\\ }" # the `//` replaces all instances; `/` just replaces the first
scp [email protected]:"$file"
3
Luke Davis

Désolé d'avoir utilisé cette question Linux pour mettre ce conseil pour Powershell sous Windows 10: le caractère d'espace échappé avec des barres obliques inverses ou entouré 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é à l'aide de "tasks.txt? Jun-22.bkp"

0
Vitor Pepicon