압축을 풀 파일을 선택하기 위한 Linux unzip 명령용 정규식 작성

압축을 풀 파일을 선택하기 위한 Linux unzip 명령용 정규식 작성

unzip 명령을 호출하는 bash 스크립트가 있는데 파일 경로에 "a", "apple" 및 "applescript"라는 3개의 특정 단어 중 하나인 하위 디렉터리 이름이 포함된 파일을 추출해야 합니다. 따라서 /a/b/c.txt 및 /com/apple/foo.txt 파일을 모두 추출해야 합니다.

일반적인 bash 명령줄 glob의 경우 비슷한 것을 사용할 수 있다는 것을 알고 있지만 */{a,apple,applescript}/*.txtunzip 명령은 bash가 아닌 glob을 평가하는 명령이기 때문에 여기에는 적용되지 않습니다.

따라서 다음과 같은 명령은 작동하지 않습니다.unzip -oj file.zip '*/{a,apple,applescript}/*.txt'

내가 시도한 것 중 하나는 다음과 같이 3개의 개별 unzip 명령을 순서대로 실행하는 것입니다.

unzip -oj file.zip '*/a/*.txt'
unzip -oj file.zip '*/apple/*.txt'
unzip -oj file.zip '*/applescript/*.txt'

a그러나 zip 파일에 하위 디렉터리와 하위 디렉터리가 명시적으로 포함되어 있지 않으면 작동하지 않으며, apple그렇게 될 것이라고 보장할 수 없습니다.

이를 달성하는 가장 좋은 방법은 무엇입니까? 정규식을 사용하여 단 하나의 zip 명령으로 이 작업을 수행할 수 있는 방법이 있습니까? 또는 zip 파일에 3개의 하위 디렉터리 이름이 모두 존재하지 않는 경우 3개의 연속 명령이 작동하도록 하는 방법이 있습니까?

답변1

중괄호 확장을 사용하고 별표를 인용하면 쉘 전역 확장으로부터 보호할 수 있습니다.

unzip -oj file.zip "*/"{a,apple,applescript}"/*.txt"

패턴 중 하나가 일치하지 않으면 여전히 오류와 함께 종료됩니다. 문제가 있는 경우 종료 상태 11(파일이 일치하지 않음을 나타냄)을 무시할 수 있습니다.

unzip -oj file.zip "*/"{a,apple,applescript}"/*.txt" || if [[ $? != 11 ]]; then
    echo Something bad happened
fi

관련 정보