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


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 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
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 user@example.com:'$(ls -t | head -1)' .pobieranie ostatnio utworzonego pliku na serwerze lub scp user@example.com:'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.


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.


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.


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

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”

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.