프로젝트를 빌드하기 전에 디렉터리에 있는 기존 바이너리를 삭제하고 싶습니다. 이제 디렉토리에는 두 개의 파일 mypackage-<version>-fast.tar.xz
과 mypackage-<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
허용하는 쉘을 사용한다고 가정하면 다음을 수행할 수 있습니다.ksh
shopt -s extglob
bash
rm mypackage-!(*-fast).tar.xz
위의 파일 이름 와일드카드 패턴 부분은 !(*-fast)
일치하는 문자열을 제외한 모든 문자열과 일치합니다 *-fast
.
zsh
KSH_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