438 Stimmen

Wie kann ich Leerzeichen im Pfad für den scp-Kopierbefehl in Linux umgehen?

Ich möchte eine Datei vom Remote-System auf das lokale System kopieren. Derzeit verwende ich das scp-Kommando im Linux-System. Einige meiner Ordner- oder Dateinamen enthalten Leerzeichen. Wenn ich versuche, diese Datei zu kopieren, wird die Fehlermeldung angezeigt: "Keine solche Datei oder Verzeichnis".

Ich habe Folgendes versucht:

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

Ich habe einige Referenzen online gefunden, aber ich verstehe sie nicht vollständig. Kann mir jemand dabei helfen?

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

684voto

Adrian Gunawan Punkte 13141

Grundsätzlich müssen Sie es zweimal escapen, weil es lokal und dann am anderen Ende escapet ist.

Es gibt ein paar Optionen, die Sie tun können (in bash):

scp benutzer@beispiel.com:"web/tmp/Master\ File\ 18\ 10\ 13.xls" .
scp benutzer@beispiel.com:web/tmp/Master\\\ File\\\ 18\\\ 10\\\ 13.xls .

Eine weitere Option funktioniert nur mit älteren Versionen von OpenSSH und möglicherweise anderen Clients:

scp benutzer@beispiel.com:"'web/tmp/Master File 18 0 13.xls'" .

104voto

Vorsprung Punkte 31298

Works

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 der String von der Shell interpretiert wird, bevor der Pfad an das scp-Kommando übergeben wird. Wenn es also beim Remote-Host ankommt, sucht der Remote-Host nach einem String mit nicht maskierten Anführungszeichen und es schlägt fehl

Um dies in Aktion zu sehen, starten Sie eine Shell mit den Optionen -vx, d.h. bash -vx und es wird die interpolierte Version des Befehls anzeigen, während es ihn ausführt.

60voto

Chris Punkte 1125

Verwenden Sie 3 Backslashes, um Leerzeichen in Verzeichnisnamen zu escapen:

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

sollte die Datei file aus dem Remote-Verzeichnis mit dem Namen directory with spaces in Ihr Downloads Verzeichnis kopieren.

54voto

MattK Punkte 1294

Außerdem können Sie etwas in der Art machen:

scp foo@bar:"\"ein Pfad/mit Leerzeichen darin/\""

Das erste Anführungszeichen wird von scp interpretiert und das zweite Anführungszeichen bewahrt die Leerzeichen.

29voto

Maxxim Punkte 2069

Beim Versuch, Dateien von entfernten Pfaden mit Leerzeichen mit scp innerhalb eines Bash-Skripts zu kopieren, bin ich auf ähnliche Probleme gestoßen.

Hier sind die Lösungen, die ich gefunden habe:

Pfade manuell escapen:

scp user@host:'dir\ with\ spaces/file\ with\ spaces' 
scp user@host:"dir\\ with\\ spaces/file\\ with\\ spaces" 
scp user@host:dir\\\ with\\\ spaces/file\\\ with\\\ spaces 

Hinweis: erfordert nicht die Option -T (siehe unten).

Doppelte Anführungszeichen + Option -T verwenden:

scp -T user@host:"'Pfad mit Leerzeichen'" 
scp -T user@host:'"Pfad mit Leerzeichen"' 
scp -T user@host:"\"Pfad mit Leerzeichen\"" 

Hinweis: Ohne die Option -T schlagen diese Befehle mit protocol error: filename does not match request fehl. Der Grund dafür wird ausführlich hier diskutiert.

Pfad mit Bash's printf escapen:

quelle="Pfad mit Leerzeichen"
printf -v quelle "%q" "${quelle}"
scp user@host:"${quelle}" 

Einzeiler für die Shell-Verwendung:

quelle="Pfad mit Leerzeichen"; printf -v quelle "%q" "${quelle}"; scp user@host:"${quelle}" 

Hinweis: Funktioniert einwandfrei ohne die Option -T.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X