it-roy-ru.com

Как избежать пробелов в пути при копировании scp в Linux?

Я новичок в Linux, я хочу скопировать файл с удаленной в локальную систему ... теперь я использую команду scp в системе Linux. У меня есть некоторые папки или имена файлов с пробелами, когда я пытаюсь скопировать это файл, он показывает сообщение об ошибке: "Нет такого файла или каталога"

Я старался:

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

Я видел некоторые ссылки в Интернете, но я не совсем понимаю, кто-нибудь может помочь в этом?

как я могу избежать пробелов в именах файлов или каталогов во время копирования ...

257
AlexPandiyan

По сути, вам нужно дважды его избежать, потому что он сбежал локально, а затем на удаленном конце.

Есть несколько вариантов, которые вы можете сделать (в 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 .
410
Adrian Gunawan

работает

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

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

не работает

scp localhost:'f/a b c' .

Причина в том, что строка интерпретируется командной оболочкой до того, как путь будет передан команде scp. Поэтому, когда он добирается до удаленного, удаленный ищет строку с неэкранированными кавычками, и это терпит неудачу

Чтобы увидеть это в действии, запустите Shell с опциями -vx, то есть bash -vx, и он будет отображать интерполированную версию команды при ее запуске.

64
Vorsprung

Также вы можете сделать что-то вроде:

scp [email protected]:"\"apath/with spaces in it/\""

Первый уровень цитат будет интерпретирован scp, а затем второй уровень цитат сохранит пробелы.

26
MattK

Используйте 3 обратной косой черты, чтобы избежать пробелов в именах каталогов:

scp [email protected]:/path/to/directory\\\ with\\\ spaces/file ~/Downloads

следует скопировать в ваш каталог Downloadsfile из удаленного каталога с именем directory with spaces.

6
Chris

Мне было очень трудно заставить это работать для переменная оболочки, содержащая имя файла с пробелами. Оказывается, используя

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

как в @ Adrian, ответ кажется неудачным (попробуйте ввести set -x перед вышеприведенными командами, чтобы увидеть, как оболочка интерпретирует эту строку; это довольно странно, и я не совсем понимаю, почему она не работает).

Оказывается, что лучше всего использовать расширение параметра до для добавления обратной косой черты в пробел следующим образом.

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