확장자에 따라 파일을 삭제하는 스크립트

확장자에 따라 파일을 삭제하는 스크립트

스크립트를 사용하여 파일 확장자 목록에 있는 확장자를 가진 모든 파일을 삭제하려면 어떻게 해야 합니까? 이 목록은 다른 프로그램을 실행할 때 생성되는 여러 파일을 쉽게 삭제해야 하기 때문에 스크립트 자체에 포함되어야 합니다.

존재하지 않는 경우 오류를 반환하지 않고 현재 디렉터리(하위 디렉터리 없음)에서 특정 확장자를 가진 모든 파일만 삭제하고 싶습니다.

터미널에서 스크립트를 실행하고 싶습니다. 확장자는 항상 동일합니다. 예를 들어 다른 프로그램에서 생성된 일부 .log 및 .txt를 삭제해야 하지만 그럴 필요가 없으므로 명령줄 인수는 필요하지 않습니다 $ myscript.

나는 bash 스크립팅에 대해 아무것도 모릅니다. 몇 가지 테스트를 작성했지만 작동하지 않아서 삭제했습니다. 의사코드에서는 다음과 같아야 합니다:

myexts = .log, .txt, .somethingelse
for ext in myexts:
    if exists *.ext
        delete *.ext

ilkkachu가 제안한 코드를 시도했지만

$ ./myscript
find: ‘’: No such file or directory
find: ‘’: No such file or directory
find: ‘’: No such file or directory

목록의 확장자를 변경하고 원래 목록의 확장자로 파일을 생성해 보았지만 항상 이 오류가 발생합니다.

답변1

Bash 또는 ksh가 있다고 가정합니다.

#!/bin/bash
extensions=(c~ h~ bak)
for e in "${extensions[@]}"; do
    find . -name "*.$e" -delete
done

또는 후자가 없으면 -exec rm -- {} +대체할 수 있습니다. 물론, 삭제될 파일을 먼저 보지 않고 테스트를 실행하고 싶을 수도 있습니다.-deletefind-delete

위의 명령은 모든 하위 디렉터리의 파일을 삭제합니다. 하위 디렉터리가 아닌 현재 디렉터리의 파일만 삭제하려면 다음을 rm사용할 수 있습니다 find.

#!/bin/bash
extensions=(c~ h~ bak)
shopt -s nullglob
for e in "${extensions[@]}"; do
    rm ./*."$e"
done

아니면 단순히

#!/bin/bash
shopt -s nullglob
rm -- *.c~ *.h~ *.bak

보다 일반적인 버전에서는 디렉터리와 확장명을 스크립트에 대한 인수로 사용합니다.

#!/bin/sh
dir=$1
shift
for e in "$@"; do
    find "$dir" -name "*.$e" -delete
done

당신은 그것을 실행하는 데 사용할 수 있습니다 rmscript.sh /some/target/dir c~ h~ bak.

관련 정보