원격 컴퓨터에 있는 파일을 파일 이름이 접두사 문자열과 일치하는 로컬 컴퓨터로 복사하고 싶습니다.
다음 명령을 사용하여 이름이 또는 로 시작하는 파일만 선택해 보았습니다 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
사용하여 셸 옵션을 활성화해야 합니다(참조:shopt
shopt
내장) Bash 확장 모드는 기본적으로 활성화되어 있지 않기 때문입니다.
prompt% scp username@hostname:"/home/user/dirname/@(foo|bar)*" .
Bash 하위 패턴을 사용 @(PATTERN-LIST)
하면 하나 이상의 패턴으로 구분된 목록을 지정할 수 있습니다 |
. 주어진 패턴 중 하나와 일치합니다. 예를 들어 , , , 와 일치 @(foo|bar)
하지만 일치하지 않습니다 .foo
bar
foobar
barfoo
foofoo
barbar
전역 별표는 빈 문자열을 포함한 모든 문자열과 일치합니다. 따라서 이 패턴은 또는 (접두사 (하위)문자열)로 시작하는 @(foo|bar)*
모든 파일 이름 과 일치합니다.foo
bar
이 방법은 원격 셸이 Bash이고 extglob
해당 셸 옵션이 활성화된 경우에 작동합니다. 사용자는 ~/.bash_profile
원격 시스템의 구성 파일에서 이 Bash 옵션을 활성화할 수 있습니다(예:).
두 번째 방법
이 방법은 다른 매개변수를 사용하여 동일한 명령을 여러 번 실행합니다. POSIX 호환 쉘을 사용하여 작동합니다.
for prefix in foo bar
do
scp username@hostname:"/home/user/dirname/${prefix}*" .
done
지원 확장
결과 표현식이 존재하지 않는 파일 이름을 지정할 수 있으므로 이 방법은 신뢰할 수 없습니다.