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


307

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

Я попытался:

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

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

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


Нет не работает !! уже сделаю это ..
AlexPandiyan

Дважды проверьте, что файл действительно существует. Поместите кавычки вокруг всего пути, включая имя пользователя и IP-адрес. В качестве альтернативы, удалите кавычки и добавьте вместо них обратную косую черту.

Ответы:


491

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

Есть несколько вариантов, которые вы можете сделать (в 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
Это довольно незначительно, но на Mac и в большинстве консольных приложений, таких как Terminal, есть опция «Paste Escaped Text». Поэтому я использовал второй вариант.
Жертвоприношение

3
«путь» работал, а «путь» не удался; сначала вывод одинарных кавычек, а затем двойные кавычки

7
Вот Это Да! Это, пожалуй, самое смешное поведение программы, которое я видел!
шутит

2
@jankes Это не без достоинств. Тот факт, что вы вводите аргумент команды оболочки, позволяет вам делать такие вещи, как scp user@example.com:'$(ls -t | head -1)' .получение самого последнего созданного файла на сервере или scp user@example.com:'dir/*.{xml,pdf}' .получение всех файлов xml и pdf из удаленного каталога. В общем, я предпочитаю это удобству с файлами с пробелами. Файлы с пробелами всегда надоедают.
JoL

1
почему это бежать 2 раза? любой способ изменить это поведение?
Fractale

76

работает

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

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

не работает

scp localhost:'f/a b c' .

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

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


Использование одинарных кавычек и экранирование работали для меня, но не двойные кавычки
Маурисио Траяно

1
@MauricioTrajano взгляните на gnu.org/software/bash/manual/html_node/Quoting.html все цитаты делают разные вещи. В простом случае выше двойные "или одиночные 'работы одинаковы
Vorsprung

34

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

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

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


4
Этот ответ недооценен, учитывая, сколько пробелов он может обработать с одинаковым количеством escape-символов. Спасибо!
Майкл

20

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

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

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


Это единственный, который работал для меня на Ubuntu 19.10. Никаких двойных кавычек, никаких мягких и жестких кавычек внутри и снаружи, ни кавычек с пробелами Только триплбэксплэш пробелы. Очень странно. Спасибо!
Ульдикс

9

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

file="foo bar/baz"
scp user@example.com:"'$file'"

как в @ Адриан ответ, кажется, не удается.

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

file="foo bar/baz"
file="${file//\ /\\\ }"
scp user@example.com:"$file"

Я бы предложил более надежное расширение «заменить все»: file="${file//\ /\\\ }"
troyfolger

Забыл об этом различии - я ржавый на моих расширениях параметров. Спасибо!
Люк Дэвис

У меня не было переменной, но это удовлетворило меня как хорошую альтернативу 3 обратным слешам для пути с большим количеством пробелов. Ни у кого нет на это времени!
Роберт Дандон

1

Извините за использование этого вопроса Linux, чтобы поставить этот совет для Powershell в Windows 10: пробел, экранирующий обратную косую черту или заключенный в кавычки, в этом случае не сработал. Не эффективно, но я решил это с помощью "?" символ вместо:

для файла "tasks.txt Jun-22.bkp" я скачал его, используя "tasks.txt? Jun-22.bkp"

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.