Jak uciec od spacji w ścieżce dla kopii SCP w systemie Linux?

307

Jestem nowy w systemie Linux, chcę skopiować plik ze zdalnego do systemu lokalnego ... teraz używam polecenia scp w systemie Linux. Mam kilka folderów lub nazw plików ze spacjami, kiedy próbuję skopiować plik, wyświetla komunikat o błędzie: „Brak takiego pliku lub katalogu”

Próbowałem:

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

Widziałem jakieś referencje online, ale nie rozumiem doskonale, czy ktoś może w tym pomóc?

Jak mogę uciec spacji w nazwie pliku lub katalogu podczas kopiowania ...

AlexPandiyan
źródło
Nie, nie działa !! już to zrobię ..
AlexPandiyan
Sprawdź dokładnie, czy plik naprawdę istnieje. Umieść cudzysłowy na całej ścieżce, w tym nazwę logowania i adres IP. Alternatywnie, zdalnie wpisz cudzysłowy i zamiast tego wstaw spację ukośnikiem odwrotnym.

Odpowiedzi:

491

Zasadniczo musisz uciec z niego dwa razy, ponieważ ucieka on lokalnie, a następnie na odległym końcu.

Istnieje kilka opcji, które możesz zrobić (w 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
źródło
11
Jest to dość niewielkie, ale na komputerze Mac i w większości aplikacji konsolowych, takich jak Terminal, dostępna jest opcja „Wklej tekst uciekający”. Dlatego skorzystałem z drugiej opcji.
Sacrilicious
3
„ścieżka” działała, a „ścieżka” zawiodła; zawarcie najpierw pojedynczych cytatów, a następnie podwójnych cudzysłowów dookoła
7
Łał! To prawdopodobnie najbardziej absurdalne zachowanie programu, jakie widziałem!
jankes
2
@jankes To nie jest bez zasług. Fakt, że wstawiasz tam argument polecenia powłoki, pozwala ci robić rzeczy takie jak scp [email protected]:'$(ls -t | head -1)' .pobieranie ostatnio utworzonego pliku na serwerze lub scp [email protected]:'dir/*.{xml,pdf}' .pobieranie wszystkich plików xml i pdf ze zdalnego katalogu. Ogólnie wolę to niż wygodę w przypadku plików, które mają spacje. Pliki ze spacjami zawsze przeszkadzają.
JoL
1
dlaczego to jest ucieczka 2 razy? jakikolwiek sposób, aby zmienić to zachowanie?
Fractale,
76

Pracuje

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

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

nie działa

scp localhost:'f/a b c' .

Powodem jest to, że ciąg jest interpretowany przez powłokę przed przekazaniem ścieżki do polecenia scp. Kiedy więc dotrze do pilota, pilot szuka ciągu z nieoznaczonymi cudzysłowami i kończy się niepowodzeniem

Aby zobaczyć to w akcji, uruchom powłokę z opcjami -vx, tzn bash -vx. Wyświetli interpolowaną wersję polecenia podczas jego uruchamiania.

Vorsprung
źródło
Używanie pojedynczych cytatów i ucieczka działało dla mnie, ale nie podwójnych
Mauricio Trajano
1
@MauricioTrajano spójrz na gnu.org/software/bash/manual/html_node/Quoting.html wszystkie cytaty robią różne rzeczy. W prostym przypadku powyżej podwójny "lub pojedynczy 'działają tak samo
Vorsprung
34

Możesz także zrobić coś takiego:

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

Pierwszy poziom cytatów zostanie zinterpretowany przez scp, a następnie drugi poziom cytatów zachowa spacje.

MattK
źródło
4
Ta odpowiedź jest niedoceniana, biorąc pod uwagę, ile spacji może obsłużyć taką samą liczbą znaków ucieczki. Dzięki!
Michael
20

Użyj 3 ukośników odwrotnych, aby uciec spacji w nazwach katalogów:

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

należy skopiować do Downloadskatalogu filez nazwanego zdalnego katalogu directory with spaces.

Chris
źródło
To jedyny, który pracował dla mnie na Ubuntu 19.10. Bez podwójnych cytatów, bez miękkich i twardych cytatów, bez cudzysłowów. Tylko potrójne spacje. Bardzo dziwne. Dziękuję Ci!
uldics
9

Miałem ogromne trudności z uruchomieniem tego dla zmiennej powłoki zawierającej nazwę pliku z białymi spacjami. Z jakiegoś powodu za pomocą

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

jak w odpowiedzi @ Adriana wydaje się, że zawodzi.

Okazuje się, że to, co działa najlepiej, to użycie rozszerzenia parametrów do dodania ukośników odwrotnych do białych znaków , jak pokazano poniżej.

file="foo bar/baz"
file="${file//\ /\\\ }"
scp [email protected]:"$file"
Luke Davis
źródło
Proponuję bardziej solidne rozszerzenie „podstaw wszystkie”: file="${file//\ /\\\ }"
troyfolger
Zapomniałem o tym rozróżnieniu - zardzewiałe moje rozszerzenia parametrów. Dzięki!
Luke Davis,
Nie miałem zmiennej, ale to zadowoliło mnie jako dobrą alternatywę dla 3 ukośników odwrotnych dla ścieżki z dużą ilością spacji. Nikt nie ma na to czasu!
Robert Dundon
1

Przepraszam, że użyłem tego pytania o Linuksa, aby umieścić tę wskazówkę dla programu PowerShell w systemie Windows 10: znak spacji uciekający z ukośnikami odwrotnymi lub otaczający cytatami nie działał dla mnie w tym przypadku. Nie wydajne, ale rozwiązałem go za pomocą „?” char zamiast:

dla pliku „tasks.txt Jun-22.bkp” Pobrałem go za pomocą „tasks.txt? Jun-22.bkp”

Vitor Pepicon
źródło