Wie entkomme ich Leerzeichen im Pfad für scp copy unter Linux?

307

Ich bin neu in Linux, ich möchte eine Datei vom Remote-System auf das lokale System kopieren ... jetzt verwende ich den Befehl scp im Linux-System. Ich habe einige Ordner oder Dateinamen mit Leerzeichen, wenn ich versuche, das zu kopieren Datei, zeigt es die Fehlermeldung: "Keine solche Datei oder Verzeichnis"

Ich habe es versucht:

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

Ich habe einige Referenzen online gesehen, aber ich verstehe sie nicht perfekt. Kann mir jemand dabei helfen?

Wie kann ich beim Kopieren Leerzeichen in Dateinamen oder Verzeichnisnamen umgehen ...

AlexPandiyan
quelle
Nein, nicht arbeiten !! mach es schon ..
AlexPandiyan
Überprüfen Sie, ob die Datei wirklich vorhanden ist. Setzen Sie die Anführungszeichen um den gesamten Pfad, einschließlich des Anmeldenamens und der IP-Adresse. Alternativ können Sie die Anführungszeichen auch entfernen und dem Leerzeichen stattdessen einen Backslash voranstellen.

Antworten:

491

Grundsätzlich müssen Sie es zweimal maskieren, da es lokal und dann auf der Remote-Seite maskiert wird.

Es gibt einige Optionen, die Sie (in Bash) ausführen können:

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
quelle
11
Dies ist ziemlich geringfügig, aber auf einem Mac und in den meisten Konsolen-Apps wie Terminal gibt es die Option "Escaped Text einfügen". Ich habe daher die zweite Option verwendet.
Sacrilicious
3
'"Pfad"' funktionierte, während "'Pfad'" fehlschlug; Abschluss zuerst einfache Anführungszeichen und dann die doppelten Anführungszeichen zu umgeben
7
Beeindruckend! Das ist wahrscheinlich das lächerlichste Programmverhalten, das ich je gesehen habe!
Jankes
2
@ Jankes Es ist nicht ohne Verdienste. Die Tatsache, dass das, was Sie dort einfügen, ein Shell-Befehlsargument ist, ermöglicht es Ihnen scp [email protected]:'$(ls -t | head -1)' ., beispielsweise die zuletzt erstellte Datei auf dem Server scp [email protected]:'dir/*.{xml,pdf}' .abzurufen oder alle XML- und PDF-Dateien aus einem Remote-Verzeichnis abzurufen. Im Allgemeinen ziehe ich dies der Bequemlichkeit von Dateien mit Leerzeichen vor. Dateien mit Leerzeichen sind immer ein Problem.
JoL
1
warum ist es Flucht 2 mal? Wie kann man dieses Verhalten ändern?
Fractale
76

funktioniert

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

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

funktioniert nicht

scp localhost:'f/a b c' .

Der Grund dafür ist, dass die Zeichenfolge von der Shell interpretiert wird, bevor der Pfad an den Befehl scp übergeben wird. Wenn es also auf die Fernbedienung gelangt, sucht die Fernbedienung nach einer Zeichenfolge mit nicht entfalteten Anführungszeichen und schlägt fehl

Um dies in Aktion zu sehen, starten Sie eine Shell mit den Optionen -vx, dh bash -vxsie zeigt die interpolierte Version des Befehls an, während er ausgeführt wird.

Vorsprung
quelle
Die Verwendung von einfachen Anführungszeichen und die Flucht funktionierten für mich, aber nicht für doppelte Anführungszeichen
Mauricio Trajano
1
@MauricioTrajano Werfen Sie einen Blick auf gnu.org/software/bash/manual/html_node/Quoting.html. Alle Zitate machen unterschiedliche Dinge. Im einfachen Fall oben Doppel- "oder '
Einzelarbeit
34

Sie können auch so etwas tun wie:

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

Die erste Anführungszeichen-Ebene wird von scp interpretiert, und die zweite Anführungszeichen-Ebene behält die Leerzeichen bei.

MattK
quelle
4
Diese Antwort ist unterbewertet, wenn man bedenkt, wie viele Leerzeichen mit der gleichen Anzahl von Escape-Zeichen verarbeitet werden können. Vielen Dank!
Michael
20

Verwenden Sie 3 Backslashes, um Leerzeichen in den Namen von Verzeichnissen zu maskieren:

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

sollte Downloadsdas fileaus dem entfernten Remote-Verzeichnis in Ihr Verzeichnis kopieren directory with spaces.

Chris
quelle
Dies ist die einzige, die unter Ubuntu 19.10 für mich funktioniert hat. Keine doppelten Anführungszeichen, keine weichen und harten Anführungszeichen, keine entkommenen Anführungszeichen. Nur tripplebackslashed Leerzeichen. Sehr merkwürdig. Danke dir!
uldics
9

Ich hatte große Schwierigkeiten, dies für eine Shell-Variable zum Laufen zu bringen, die einen Dateinamen mit Leerzeichen enthält. Aus irgendeinem Grund mit

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

wie in @ Adrians Antwort scheint zu scheitern.

Es stellt sich heraus, dass am besten eine Parametererweiterung verwendet wird, um Backslashes wie folgt vor das Leerzeichen zu stellen .

file="foo bar/baz"
file="${file//\ /\\\ }"
scp [email protected]:"$file"
Luke Davis
quelle
Ich würde die robustere Erweiterung "Alle ersetzen" file="${file//\ /\\\ }"
vorschlagen
Ich habe diese Unterscheidung vergessen - ich bin verrostet bei meinen Parametererweiterungen. Vielen Dank!
Luke Davis
Ich hatte keine Variable, aber dies befriedigte mich als gute Alternative zu 3 Backslashes für einen Pfad mit vielen Leerzeichen. Dafür hat niemand Zeit!
Robert Dundon
1

Es tut mir leid, dass Sie diese Linux-Frage verwendet haben, um diesen Tipp für Powershell unter Windows 10 zu verwenden: Das Leerzeichen, das mit Backslashes oder Anführungszeichen umgeht, hat in diesem Fall bei mir nicht funktioniert. Nicht effizient, aber ich habe es mit dem "?" char stattdessen:

Für die Datei "task.txt Jun-22.bkp" habe ich sie mit "task.txt? Jun-22.bkp" heruntergeladen.

Vitor Pepicon
quelle