Linux에서 scp 복사를 위해 경로에서 공백을 어떻게 피합니까?


307

나는 리눅스를 처음 사용하고 원격에서 로컬 시스템으로 파일을 복사하고 싶습니다 ... 이제 리눅스 시스템에서 scp 명령을 사용하고 있습니다. 복사하려고 할 때 폴더 나 파일 이름에 공백이 있습니다. 파일에는 "No such file or directory"라는 오류 메시지가 표시됩니다.

나는 시도했다 :

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 및 터미널과 같은 대부분의 콘솔 응용 프로그램에는 '붙여 넣은 텍스트 붙여 넣기'옵션이 있습니다. 따라서 두 번째 옵션을 사용했습니다.
Sacrilicious

3
""path ""은 (는) 실패했지만 ""path ""는 실패했습니다. 결론 작은 따옴표를 먼저 사용한 다음 큰 따옴표를 둘러싼

7
와! 그것은 내가 본 것 중 가장 우스운 프로그램 행동 일 것입니다!
jankes

2
@jankes 장점이 없습니다. 쉘 명령 인수를 사용하면 scp user@example.com:'$(ls -t | head -1)' .서버에서 가장 최근에 작성된 파일 scp user@example.com:'dir/*.{xml,pdf}' .을 가져 오거나 원격 디렉토리에서 모든 xml 및 pdf 파일 을 얻는 것과 같은 작업을 수행 할 수 있습니다 . 일반적으로 공백이있는 파일로 편의를 갖는 것보다 이것을 선호합니다. 공백이있는 파일은 항상 귀찮습니다.
JoL

1
왜 두 번 탈출합니까? 이 행동을 바꿀 방법이 있습니까?
Fractale

76

공장

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

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

작동하지 않습니다

scp localhost:'f/a b c' .

경로가 scp 명령으로 전달되기 전에 셸에서 문자열을 해석하기 때문입니다. 그래서 리모컨에 도달하면 리모컨은 이스케이프되지 않은 따옴표가있는 문자열을 찾고 실패합니다.

이것을 실제로 보려면 -vx 옵션으로 쉘을 시작하십시오. 즉 bash -vx, 명령이 실행될 때 보간 된 버전의 명령이 표시됩니다.


작은 따옴표와 이스케이프를 사용하면 큰 따옴표가 아니라 나를 위해 일했습니다.
Mauricio Trajano

1
한 번 봐 걸릴 @MauricioTrajano gnu.org/software/bash/manual/html_node/Quoting.html을 모두 따옴표는 다른 일을. 위의 간단한 두 번 "또는 단일 '작업
Vorsprung

34

또한 다음과 같은 작업을 수행 할 수 있습니다.

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

첫 번째 따옴표 수준은 scp로 해석되고 두 번째 따옴표 수준은 공백을 유지합니다.


4
이 답변은 동일한 이스케이프 문자로 처리 할 수있는 공간 수를 고려하여 과소 평가되었습니다. 감사!
Michael

20

3 개의 백 슬래시를 사용하여 디렉토리 이름에서 공백을 이스케이프하십시오.

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

라는 원격 디렉토리에서 Downloads디렉토리로 복사해야합니다 .filedirectory with spaces


이것은 우분투 19.10에서 나를 위해 일한 유일한 것입니다. 큰 따옴표도없고, 부드러운 따옴표 나 따옴표도없고, 이스케이프 된 따옴표도 없습니다. 트립 백 슬래시 공간 만 엄청 이상해. 감사합니다!
uldics

9

공백이있는 파일 이름을 포함하는 셸 변수 에서이 작업을 수행하는 데 큰 어려움이있었습니다 . 어떤 이유로

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

@Adrian의 답변 에서처럼 실패합니다.

가장 효과적인 방법 은 다음과 같이 매개 변수 확장을 사용하여 백 슬래시를 공백 에 추가하는 것입니다.

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

보다 강력한 '모두 대체'확장을 제안합니다. file="${file//\ /\\\ }"
troyfolger

그 차이점을 잊어 버렸습니다. 매개 변수 확장이 녹슬 었습니다. 감사!
Luke Davis

나는 변수가 없었지만 이것은 많은 공간이있는 경로에 대한 3 개의 백 슬래시에 대한 좋은 대안으로 나를 만족시켰다. 아무도 그럴 시간이 없습니다!
Robert Dundon

1

이 Linux 질문을 사용하여 Windows 10에서 Powershell에 대한이 팁을 넣은 것에 대해 죄송합니다.이 경우 백 슬래시로 이스케이프되거나 따옴표로 둘러 싸인 공백 문자가 작동하지 않았습니다. 비효율적이지만 "?"를 사용하여 해결했습니다. 대신 char

"tasks.txt Jun-22.bkp"파일의 경우 "tasks.txt? Jun-22.bkp"를 사용하여 다운로드했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.