Як уникнути пробілів на шляху до 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

В основному вам потрібно уникнути цього двічі, тому що він втік локально, а потім на віддаленому кінці.

Є кілька варіантів, які ви можете зробити (в башті):

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, є опція "Вставити утечений текст". Тому я використав другий варіант.
Sacrilicious

3
'"шлях"' працював, поки "шлях" не вдався; висновок одиничних цитат спочатку, а потім подвійні лапки в оточенні

7
Оце Так! Це, мабуть, єдина найсмішніша поведінка програми, яку я бачив!
jankes

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
Ця відповідь є заниженою, враховуючи, скільки пробілів може обробляти однакова кількість символів втечі. Дякую!
Майкл

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: пробіл, який пробіг із зворотними косими рисами або оточує лапки, у мене в цьому випадку не спрацював. Не ефективно, але я вирішив це за допомогою "?" замість цього:

для файлу "task.txt Jun-22.bkp" Я завантажив його за допомогою "task.txt? Jun-22.bkp"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.