접두사 하위 문자열을 지정하여 파일 이름을 일치시키는 방법은 무엇입니까?

접두사 하위 문자열을 지정하여 파일 이름을 일치시키는 방법은 무엇입니까?

원격 컴퓨터에 있는 파일을 파일 이름이 접두사 문자열과 일치하는 로컬 컴퓨터로 복사하고 싶습니다.

다음 명령을 사용하여 이름이 또는 로 시작하는 파일만 선택해 보았습니다 massif.calgrind

scp my-machine:/home/user/a-folder/[massif,callgrind]* .

그러나 이 표현식을 사용하면 빈 문자열과 임의 개수의 문자를 일치시켜 디렉터리와 관련된 모든 파일 이름을 일치시킬 수 있습니다.

작동하게 하려면 무엇을 변경해야 합니까?

답변1

중괄호를 원하는 것 같습니다.

scp my-machine:/home/user/a-folder/{massif,callgrind}* .

그렇지 않으면 두 개의 완전한 문자열 대신 단일 문자를 일치시킵니다.

bash다양한 유형의 확장 및 대체를 수행합니다. 이러한 내용은 bash 매뉴얼 페이지 - 찾기 섹션에 설명되어 있습니다 EXPANSION. 여기서 유형은 "경로 이름 확장"(경로 이름과 일치) 및 "Brace 확장"(존재하는 파일에 관계없이 제공된 옵션에서 여러 인수를 생성) [아래에 포함됩니다 .{

답변2

파일을 선택하는 방법에는 두 가지가 있습니다. 패턴을 연속적으로 지정할 수도 있고 순차적으로 지정할 수도 있습니다.

첫 번째 방법

이 방법은배쉬 확장 모드여러 패턴을 함께 지정하세요. 사용자는 내장 명령을 extglob사용하여 셸 옵션을 활성화해야 합니다(참조:shoptshopt내장) Bash 확장 모드는 기본적으로 활성화되어 있지 않기 때문입니다.

prompt% scp username@hostname:"/home/user/dirname/@(foo|bar)*" .

Bash 하위 패턴을 사용 @(PATTERN-LIST)하면 하나 이상의 패턴으로 구분된 목록을 지정할 수 있습니다 |. 주어진 패턴 중 하나와 일치합니다. 예를 들어 , , , 와 일치 @(foo|bar)하지만 일치하지 않습니다 .foobarfoobarbarfoofoofoobarbar

전역 별표는 빈 문자열을 포함한 모든 문자열과 일치합니다. 따라서 이 패턴은 또는 (접두사 (하위)문자열)로 시작하는 @(foo|bar)*모든 파일 이름 과 일치합니다.foobar

이 방법은 원격 셸이 Bash이고 extglob해당 셸 옵션이 활성화된 경우에 작동합니다. 사용자는 ~/.bash_profile원격 시스템의 구성 파일에서 이 Bash 옵션을 활성화할 수 있습니다(예:).

두 번째 방법

이 방법은 다른 매개변수를 사용하여 동일한 명령을 여러 번 실행합니다. POSIX 호환 쉘을 사용하여 작동합니다.

for prefix in foo bar
do
    scp username@hostname:"/home/user/dirname/${prefix}*" .
done

지원 확장

결과 표현식이 존재하지 않는 파일 이름을 지정할 수 있으므로 이 방법은 신뢰할 수 없습니다.

관련 정보