디렉토리에 있는 파일을 제외한 모든 파일을 어떻게 (안전하게) 삭제할 수 있습니까?

디렉토리에 있는 파일을 제외한 모든 파일을 어떻게 (안전하게) 삭제할 수 있습니까?

환경

시스템: 리눅스 민트 19 시나몬.

셸: Bash 버전 4.4.19(1).


질문

수백 개의 테스트 시나리오 외에도 셀 수 없이 많은 테스트 시나리오를 만들었나 봐요.일시적인매번 파일이 포함된 설치 디렉터리를 수동으로 삭제해야 합니다. 다음과 같습니다.

$ ls --group-directories-first --classify

test1/  test2/  testA/  testFin/  decrypt-file-aes256*  encrypt-file-aes256*  Makefile  openssl-encryption.tar.xz  openssl-encryption.tar.xz.asc  SHA512SUM

이 청소 과정을 자동화하고 싶습니다.


진전

나는 이 find명령이 매우 유용하다고 생각했습니다. 예를 들면 다음과 같습니다.

find . -maxdepth 1 -type d -exec rm -rf {} +

터미널의 초기 테스트에서는 이것이 작동하는 것으로 나타났습니다. 그러나 이것을 깨끗한 대상인 Makefile에 넣기 전에 고려해야 할 안전 조치가 있는지 묻고 싶습니다.


그러나 이 예에서는 작은 오류가 발생합니다.

rm: refusing to remove '.' or '..' directory: skipping '.'

여기서 어떻게 더 구체적으로 설명할 수 있나요?


현재 리팩토링을 위한 "깨끗한" Makefile 대상

clean:

    @echo; tput bold; tput setaf 3; echo Target: $@; tput sgr0; echo

    @if [ $$(id --user) -eq 0 ]; then \
        tput bold; tput setaf 1; echo "ERROR: Target '$@' has to be run as normal user!"; tput sgr0; echo; exit 1; \
    fi

    @if [ ! -f .safeclean-$(distrib_name) ]; then \
        tput bold; tput setaf 1; echo "ERROR: Target '$@' has to be run from within its Makefile's directory!"; tput sgr0; echo; exit 1; \
    fi

    @ls -l | grep '^d' > /dev/null || echo "There are no more directories."

    @for dir in *; do \
        if [ -d "$$dir" ]; then rm --force --recursive --verbose "$$dir"; fi \
    done

    @rm --force --verbose $(distrib_name).tar.xz $(distrib_name).tar.xz.asc

    @echo; tput bold; tput setaf 2; echo "Ok. Directory clean successful."; tput sgr0

예제 출력(시각적)

예제 출력(시각적)

답변1

첫째, Makefile에서 + 작업을 수행하기 find전에 매우 주의하십시오 .rm

그렇다면 스크립트를 작성하는 것이 더 쉬울 수도 있습니다.

myclean:
        test -f .safefile && \
        for fn in * ; do \
                test -d "$$fn" && rm -rf "$$fn" ; \
        done

.safefile최상위 디렉터리에 있어야 하는 파일은 어디에 있습니까? 실수로 다른 위치에서 실행하지 않도록 보장합니다.

추가 보너스는 필요한 경우 논리를 추가할 수도 있다는 것입니다.

관련 정보