몇 가지 확장 프로그램을 제외하고 모두 제거

몇 가지 확장 프로그램을 제외하고 모두 제거

rm정규식을 사용하여 명령을 수정하거나 무언가를 제거 할 수 있습니까 ? 현재 디렉터리의 모든 파일(확장자가 ? 인 파일 제외 ) *.bmp은 또는 같은 파일이 있으므로 대소문자를 구분하지 않아야 합니다 .*.wav*.png*.BMP*.bMP

답변1

@ChrisDown이 제공했습니다.떨어져 bash있는이는 파일과 디렉터리의 차이점과 삭제할 파일이 없는지 여부를 고려합니다.

그러나 rm이러한 경우에는 실패하므로 명령을 다음과 같이 단순화할 수 있습니다(계속 사용할 수 있음 bash).

shopt -s extglob nocaseglob
rm -- !(*.bmp|*.wav|*.png)

두 셸 옵션을 모두 기본값으로 재설정하는 것을 잊지 마세요. 내 경우에는 extglob대화형 셸에 이미 설정되어 있으므로 방금 필요했습니다.

shopt -u nocaseglob

또는 서브셸에서 다음 두 명령을 실행합니다.

(shopt -s extglob nocaseglob
rm -- !(*.bmp|*.wav|*.png))

rm어떤 파일이 삭제될지 미리 확인 하려면 echo.

숨겨진 파일도 제거하려면 해당 dotglob옵션을 추가하세요.

답변2

bash를 사용하는 경우 및 를 조합 하여 사용할 수 있습니다 .extglobnocaseglob

shopt -s extglob nocaseglob
for file in !(@(*.bmp|*.wav|*.png)); do
    [[ -f "${file}" ]] && files+=( "${file}" )
done
(( ${#files[@]} )) && rm "${files[@]}"

그렇지 않으면 다음과 같이 할 수 있습니다:

find . -maxdepth 1 -type f ! \( -iname '*.bmp' -o -iname '*.wav' -o \
    -iname '*.png' \) -delete

답변3

사용 zsh, 삭제정기적인.bmp, .png,를 제외한 파일 .wav(대소문자 구분):

setopt extendedglob # best in ~/.zshrc
rm -- ^*.(#i)(png|bmp|wav)(D.)

( D확장자에 관계없이 숨김 파일을 유지하려면 위 항목을 삭제하세요.)

답변4

실수로 어리석은 일을 하지 않도록 잠시 시간을 내어 여러 단계를 거쳐 이 작업을 수행하는 것이 좋습니다.

  1. 삭제할 파일을 식별하는 명령을 만듭니다.

        ls | grep -v *.bmp | grep -v *.wav  # current directory
    

    또는

        find . -type f | grep -v *.bmp      # current and sub directories
    

    반환된 파일 목록이 삭제하려는 파일인 경우

  2. 마지막 명령을 호출하고 xargs rm이 명령을 추가합니다.

        ls | grep -v *.bmp | grep -v *.wav | xargs rm
    

관련 정보