Как мне избежать пробелов в пути для копирования 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.