Bash 스크립트에서 여러 파일을 복사하는 방법

Bash 스크립트에서 여러 파일을 복사하는 방법

bash 스크립트나 쉘에서 여러 파일을 복사하는 방법을 알고 싶습니다. 내 말은

cp /path/to/source/{file1,file2,file3} /path/to/dest

그리고

scp /path/to/source/{file1,file2,file3} user@host:/path/to/dest

잘 작동하겠지만, 예를 들어

#!/bin/sh
scp /path/to/source/{file1,file2,file3} user@host:/path/to/dest

다음과 같은 오류가 발생합니다.

/path/to/source/{file1,file2,file3}: No such file or directory

단일 파일을 복사하거나 셸 복사하는 경우 작동하므로 문제는 여러 파일입니다. 모든 파일 에 사용하고 싶지만 모두 복사하고 싶지 않은 경우 *에도 작동합니다 . 두 폴더에 이름은 같지만 내용이 다른 파일이 있기 때문에 선택한 파일만 복사해야 합니다. 따라서 모든 파일을 복사한 다음 원하지 않는 파일을 삭제하는 것은 작동하지 않습니다.

다음을 더 잘 이해하려면:

#!/bin/sh
scp /path/to/source/file1 user@host:/path/to/dest

또한 다음과 같습니다.

#!/bin/sh
scp /path/to/source/* user@host:/path/to/dest

따라서 이것은 { ... }터미널 내에서 실행될 여러 파일을 올바르게 사용하는 것과 관련이 있지만 bash 스크립트를 실행하는 경우에는 그렇지 않습니다.

미리 감사드립니다.

//편집하다:

cp를 사용하려고 하면 오류가 발생합니다.

cp: cannot stat '/path/to/source/{file1,file2,file3}': No such file or directory

답변1

귀하의 스크립트 는 대신 #!/bin/sh실행될 것임을 의미 합니다 . Ubuntu와 같은 많은 Debian 파생 제품에서 이는 기본 POSIX 쉘에 대한 기호 링크입니다 . 사용 중인 중괄호 확장은 다음에서 지원되지 않습니다 .shbash/bin/shdashdash

$ dash
$ echo {foo,bar}
{foo,bar}

이는 명령이 cp /path/to/source/{file1,file2,file3} /path/to/dest이라는 이름의 항목을 찾고 있음 을 의미합니다 {file1,file2,file3}. 간단한 해결책은 bash대체를 사용하는 것입니다. shebang 줄을 에서 으로 변경 #!/bin/sh하십시오 #!/bin/bash.

관련 정보