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

178

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

Я пробовал:

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

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

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

  • 0
    Нет не работает !! уже сделай это ..
  • 0
    Дважды проверьте, что файл действительно существует. Поместите кавычки вокруг всего пути, включая имя пользователя и IP-адрес. В качестве альтернативы, удалите кавычки и добавьте вместо них обратную косую черту.
Теги:
whitespace
scp

4 ответа

278

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

Есть несколько вариантов, которые вы можете сделать (в 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 .
  • 7
    Это довольно незначительно, но на Mac и в большинстве консольных приложений, таких как Terminal, есть опция Paste Escaped Text. Поэтому я использовал второй вариант.
  • 0
    Вот соответствующий вопрос: stackoverflow.com/questions/5608112/…
Показать ещё 5 комментариев
41

работы

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

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

не работает

scp localhost:'f/a b c' .

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

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

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

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

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

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

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

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

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

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

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

file="foo bar/baz"    
file="${file/\ /\\\ }"
scp user@example.com:"$file"
  • 0
    Я хотел бы предложить более надежное расширение «заменить все»: file="${file//\ /\\\ }"
  • 0
    Забыл об этом различии - я ржавый на моих расширениях параметров. Спасибо!
Показать ещё 1 комментарий
Сообщество Overcoder
Наверх
Меню