와일드카드는 mypackage*.tar.xz와 일치하지만 mypackage*fast.tar.xz와 일치하지 않습니까?

와일드카드는 mypackage*.tar.xz와 일치하지만 mypackage*fast.tar.xz와 일치하지 않습니까?

프로젝트를 빌드하기 전에 디렉터리에 있는 기존 바이너리를 삭제하고 싶습니다. 이제 디렉토리에는 두 개의 파일 mypackage-<version>-fast.tar.xzmypackage-<version>.tar.xz. 파일을 삭제하는 mypackage-<version>.tar.xz것이 아니라 삭제하고 싶습니다 .*fast.tar.xz

실행하면 rm mypackage-*.tar.xz이 두 파일이 삭제되고 find . -type f ! -name *fast.tar.xz디렉터리에 삭제하고 싶지 않은 다른 소스 파일이 나열됩니다.

답변1

패키지 버전이 항상 숫자로 끝나는 경우 다음을 사용할 수 있습니다.

rm mypackage-*[0-9].tar.xz

-fast...또는 패키지 변형(또는 그 자체)에 대한 일치를 제외하고 버전 번호의 끝을 일치시키는 유사한 방법을 사용할 수 있습니다 mypackage-*[!t].tar.xz.

이것이 불가능하다면...

예를 들어 확장 스타일 글로빙 패턴( in 을 통해 활성화 ) 을 bash허용하는 쉘을 사용한다고 가정하면 다음을 수행할 수 있습니다.kshshopt -s extglobbash

rm mypackage-!(*-fast).tar.xz

위의 파일 이름 와일드카드 패턴 부분은 !(*-fast)일치하는 문자열을 제외한 모든 문자열과 일치합니다 *-fast.

zshKSH_GLOB이는 쉘 옵션( )이 설정된 경우 setopt KSH_GLOB쉘에도 적용됩니다 . zsh확장된 와일드카드( )를 활성화하면 setopt EXTENDED_GLOB다음을 사용할 수 있습니다.

rm mypackage-^(*-fast).tar.xz

(.)일반 파일만 삭제하려면 파일 이름 와일드카드 패턴의 맨 끝에 glob 한정자를 추가하세요 .

sh쉘 에서는 다음을 사용할 수 있습니다.

for name in mypackage-*.tar.xz; do
    case $name in (mypackage-*-fast.tar.xz) ;; (*) rm "$name"; esac
done

또는,

for name in mypackage-*.tar.xz; do
    case $name in (mypackage-*-fast.tar.xz) continue; esac
    rm "$name"
done

이는 일치하는 모든 이름을 반복하고 mypackage-*.tar.xz추가로 일치하는 이름을 건너뛰고 mypackage-*-fast.tar.xz나머지 이름을 제거합니다.

답변2

find 명령을 사용할 수 있지만 추가 쿼리를 지정해야 합니다.

find . -type f -name 'mypackage-*.tar.xz' ! -name 'mypackage-*fast.tar.xz'

-delete그런 다음 다양한 버전의 find에서 사용되는 작업을 사용하여 찾은 파일을 삭제할 수 있습니다 .

find . -type f -name 'mypackage-*.tar.xz' ! -name 'mypackage-*fast.tar.xz' -delete

관련 정보