일부 디렉터리를 제외하고 비어 있지 않더라도 파일 및 디렉터리를 삭제합니다.

일부 디렉터리를 제외하고 비어 있지 않더라도 파일 및 디렉터리를 삭제합니다.

디렉토리의 모든 내용과 일부 제외 내용을 삭제하려고 합니다. 나는 현재 이것을 사용하고 있습니다 :

find . -type f | grep -vZf ../../exclude.file | xargs rm -rf

여기에는 다음이 exclude.file포함됩니다.

*log*
world*
crash-reports
banned-ips*

world, 폴더 또는 그 내용을 삭제하고 싶지 않습니다(*는 으로 생성된 백업을 덮어쓰는 것 log입니다 ) .crash-reportsworld.zip

위 명령은 이 작업을 수행하지만 비어 있지 않은 디렉터리는 삭제하지 않습니다. 예를 들어 Config디렉터리는 보존되어 있지만 삭제해야 합니다.

나는 또한 다음과 같은 것을 시도했습니다.

find -maxdepth 0 -not -name '*log*' -not -name 'crash-reports' -not -name 'world*' | xargs rm -rf

그러나 나는 여전히 같은 결과를 얻습니다.

이를 수행할 수 있는 방법이 있습니까?

답변1

-type f디렉터리는 검색할 수 없고 파일만 검색할 수 있습니다. -maxdepth 0검색 중인 디렉토리만 검색됩니다( .). 실제로 전달하려는 파일을 찾아야 합니다 rm.

표준 접근 방식은 디렉터리를 제외하는 것입니다.그리고 그 모든 내용다음과 같습니다(테스트되지 않음!).

find . -mindepth 1 \( -name '*log*' -o -name 'crash-reports' -o -name 'world*' \) -prune -o -print

답변2

findIMHO, 건너뛰려는 모든 디렉터리가 첫 번째 디렉터리 수준에 있다는 것을 알지 않는 한 단일 실행으로 원하는 것을 달성하는 것은 불가능합니다 .

첫 번째 단계

처음 실행 시 모든 파일(또는 디렉터리가 아닌 파일)을 삭제합니다.

find . \( -type d \
  \( -name '*log*' -o -name 'world*' -o -name 'crash-reports' -o -name 'banned-ips*' \) \
  -prune \) -o \( -type d -o -print \)

2 단계

건너뛸 각 (하위) 디렉터리에 더미 파일을 만듭니다.

find . -type d \( \
  \( -name '*log*' -o -name 'world*' -o -name 'crash-reports' -o -name 'banned-ips*' \) \
  -o \( -path '*/*log*/*' -o  -path '*/world*/*' -o  -path '*/crash-reports/*' -o  -path '*/banned-ips*/*' \) \) \
  -exec touch {}/dontdeletethisdirecory

세 번째 단계

이제 모든 빈 디렉토리를 삭제할 수 있습니다. 쉬운 방법은 모든 디렉토리를 에 전달 rmdir하고 빈 디렉토리만 제거하는 것입니다.

find . -depth -type d -exec rmdir {} \;

선택적 마지막 단계

이제 더미 파일을 삭제할 수 있습니다.

find . -type -f -name dontdeletethisdirecory -delete

관련 정보