리소스 디렉터리에 다음 파일이 포함된 구성 jar이 있습니다. 이름은 다음 <text>-<text>.properties
과 같은 형식입니다 .<text>-<text>-<alphanumeric>.properties
abb-servicea.properties
abb-servicea-dev1.properties
abb-serviceb-dev2.properties
abb-servicea-prod.properties
abb-serviceb.properties
jar에서 다음 파일을 추출하면 됩니다.
abb-servicea.properties
abb-serviceb.properties
나는 노력했다 unzip abb-configs.jar abb-*[a-z].properties
. 구체적으로 abb-servicea.properties
및 를 선택할 수는 없습니다 abb-serviceb.properties
. 그것도 abb-servicea-prod.properties
결국 보여주게 돼
abb-servicea.properties
abb-serviceb.properties
abb-servicea-prod.properties
패턴이 있는 파일을 추출하는 방법은 무엇입니까 abb-<servicename>.properties
?
편집하다:속성 이름은 임의적일 수 있습니다 abb-<anyservicename>.properties
. 예를 들면 다음과 같습니다 abb-serviceb.properties
. 따라서 본질적으로 파일을 다음과 같이 추출해야 합니다.
abb-servicea.properties
abb-serviceb.properties
답변1
다음을 수행할 수 있습니다.
bsdtar --exclude='*-*-*' -xf abb-configs.jar 'abb-*.properties'
abb-*.properties
두 개의 -
s를 포함하는 예외 가 추출됩니다 .
정규 표현식을 사용하려면:
bsdtar -'s/^abb-[[:alpha:]]*\.properties$/~/' -'s/.*//' -xf abb-configs.jar
이들 중 첫 번째는 -s
추출하려는 아카이브 멤버에 대해 noop 교체를 수행하고( 's ~
와 동일 &
) 두 번째는 원하지 않는 멤버(아직 첫 번째 항목과 일치하지 않음)를 제거하므로 결국 표현식과 일치하는 정규식 아카이브 멤버 로 이름을 추출합니다 .sed
s
^abb-[[:alpha:]]*\.properties$
[[:alpha:]]*
0개 이상의 알파 시퀀스와 일치합니다. [^-]*
이외의 문자 시퀀스를 사용할 수도 있습니다 -
. "0개 이상" 대신 "1개 이상" *
으로 바꾸세요 .\{1,\}
귀하의 장소:
unzip abb-configs.jar abb-*[a-z].properties
먼저 *
및 [a-z]
는 쉘 와일드카드이므로 인용해야 합니다.
unzip abb-configs.jar 'abb-*[a-z].properties'
(여기에는 전체 주장이 인용되어 있습니다).
unzip
패턴을 정규 표현식이 아닌 (기본) 쉘 와일드카드 패턴으로 생각하십시오.
셸 와일드카드에서는 *
임의의 수의 문자(예: .*
정규식)를 나타냅니다. 그래서 여기서는 on 과 on 과 일치 하기 abb-servicea-prod.service
때문에 *
on servicea-pro
과 일치합니다 .[a-z]
d
[[:alpha:]]+
일부 셸에는 확장 정규식이나 [[:alpha:]]\{1,\}
기본 정규식 과 같이 하나 이상의 문자와 일치할 수 있는 고급 와일드카드 연산자가 있습니다 . 여기에는 ksh +([[:alpha:]])
(지원됨 bash -O extglob
) 및 zsh -o extendedglob
ksh 가 포함되지만 [[:alpha:]]##
지원되지는 않습니다 unzip
.
다음을 수행하여 셸의 와일드카드 패턴을 계속 사용할 수 있습니다(여기서는 zsh
예).
set -o extendedglob
members=( ${(f)"$(bsdtar tf abb-configs.jar)"} )
wanted=( ${(M)members:#abb-[[:alpha:]]##.properties} )
(( $#wanted )) && print -rNC1 -- $wanted |
bsdtar --null -T /dev/stdin -nxf abb-configs.jar
또는 정규식 일치 grep
(및 모든 셸)의 경우:
bsdtar tf abb-configs.jar |
grep -xE 'abb-[[:alpha:]]+\.properties' |
tr '\n' '\0' |
bsdtar --null -T /dev/stdin -nxf abb-configs.jar
이것들을 봐둘 질문for의 현재 버전은 이 방법을 다른 모드와 함께 사용할 경우 bsdtar
잠재적인 문제를 나타냅니다 .
bsdtar
tar
는 수십 가지의 다양한 아카이브 형식에서 작동할 수 있는 라이브러리와 유사한 CLI 인터페이스 이므로 libarchive
가능한 경우 일반적으로 아카이브를 처리하는 데 사용하려는 명령 중 하나입니다. 그러면 모든 아카이브 형식에 동일한 API를 사용할 수 있기 때문입니다.
ZIP 파일이 없고 설치할 수 없지만 ZIP 파일만 처리할 수 있는 bsdtar
Info-ZIP 명령이 있는 경우(그리고 파일이 그러한 파일인 경우) 동일한 작업을 수행할 수 있습니다(GNU 가정 ) :unzip
jar
xargs
xargs -rd '\n' -a <(
unzip -Z1 abb-configs.jar |
grep -xE 'abb-[[:alpha:]]+\.properties'
) unzip -q abb-configs.jar
( unzip
또한 매개변수를 와일드카드 패턴으로 간주하십시오. 이는 우리가 선택한 매개변수에 와일드카드가 포함되어 있지 않기 때문에 문제가 되지 않습니다.)