하나의 파일 확장자를 유지하고 다른 파일 확장자를 제거하는 방법은 무엇입니까?

하나의 파일 확장자를 유지하고 다른 파일 확장자를 제거하는 방법은 무엇입니까?

.tr0내 디렉토리에 , .scs, .mt0, .ic0, .log, .st0, 등 많은 파일 확장자가 있습니다 .pa0.

다른 모든 확장 프로그램을 유지 .tr0하고 제거하고 싶습니다 ..scs

교체할 수 있는 효과적인 방법이 있습니까?

rm *.mt0 *.ic0 *.log *.st0 *.pa0 

답변1

앞쪽:

find . ! \( -name '*.tr0' -o -name '*.scs' \) -type f -exec echo rm -f {} +

echo(명령어를 실행하고 싶을 때는 제거하세요)

find당신이 지원하는 경우 -delete:

find . ! \( -name '*.tr0' -o -name '*.scs' \) -type f -delete

위 명령은 재귀적으로 작동합니다. 현재 디렉토리에만 있으려면 다음을 수행하십시오.

find . ! -name . -prune ! \( -name '*.tr0' -o -name '*.scs' \) -type f

답변2

셸 옵션( ) 또는 다음 bash을 활성화하는 등 확장된 와일드카드 패턴을 허용하는 셸에서 :extglobshopt -s extglobksh93

rm ./*.!(tr0|scs)

확장 쉘 와일드카드 패턴은 !(pattern-list)-delimited에 지정된 패턴을 제외한 모든 패턴과 일치합니다.|pattern-list


점이 포함된 경우 패턴은 디렉터리 이름과도 일치하지만 rm디렉터리는 기본적으로 삭제되지 않으므로 일부 오류 메시지만 표시됩니다.

이 문제를 해결하려면 일치하는 각 이름을 테스트하여 일반 파일을 참조하는지 확인하는 루프를 사용할 수 있습니다.

for name in ./*.!(tr0|scs); do
    [ -f "$name" ] && rm "$name"
done

관련 정보