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.