특정 폴더와 그 내용이 아닌 디렉토리의 모든 것을 삭제하는 방법

특정 폴더와 그 내용이 아닌 디렉토리의 모든 것을 삭제하는 방법

내 폴더 구조는 다음과 같습니다.

./build
./module/build
./source

내가 유지하고 싶은 것은 ./build와 그 내용뿐입니다.

이 명령은 find . \! -path ./build -delete을 삭제하지는 않지만 ./build해당 내용을 모두 삭제합니다.

이 상황을 피하는 방법은 무엇입니까?

답변1

사용 중인 셸(bash) 활용:

shopt -s extglob
rm -rfvi ./!(build)

답변2

노력하다:

find . \! \( -wholename "./build/*" -o -wholename ./build \) -delete

실행하는 경우:

rm -rf /tmp/tmp2
mkdir /tmp/tmp2
cd /tmp/tmp2

mkdir -p build module/build source
touch .hidden build/abc build/abc2 source/def module/build/ghi

find . \! \( -wholename "./build/*" -o -wholename ./build \) -delete

find .

결과는 다음과 같습니다:

./build
./build/abc

이는 출력을 구문 분석하는 것보다 훨씬 안전합니다 ls. 파일이나 디렉토리 이름에 공백이 있거나 더 나쁜 경우 삽입된 개행 문자를 처리해야 합니다 find.

답변3

Jimmy의 완벽한 답변을 확장하면 다음과 같습니다.

shopt -s extglob

확장된 패턴 일치를 bash에 로드하는 중입니다. 에서 man bash:

If the extglob shell option is enabled using the shopt builtin, several
extended pattern matching operators are recognized.  In  the  following
description, a pattern-list is a list of one or more patterns separated
by a |.  Composite patterns may be formed using  one  or  more  of  the
following sub-patterns:

      ?(pattern-list)
             Matches zero or one occurrence of the given patterns
      *(pattern-list)
             Matches zero or more occurrences of the given patterns
      +(pattern-list)
             Matches one or more occurrences of the given patterns
      @(pattern-list)
             Matches one of the given patterns
      !(pattern-list)
             Matches anything except one of the given patterns

그래서:

rm -rfvi ./!(build)

이 주어진 패턴을 제외한 모든 것을 제거하도록 평가합니다.

답변4

find . \! -path ./build -do_something에 대해 작업을 수행하지 않지만 ./build반복하여 그 아래의 파일과 일치합니다. find에게 디렉토리를 탐색하지 말라고 지시하려면 action을 전달하십시오 -prune.

find . -path ./build -prune -o . -o -delete

"전체 경로가 다음과 같으면 ./build순회하지 마세요. 그렇지 않으면 현재 디렉터리이면 아무 것도 하지 말고, 그렇지 않으면 파일을 삭제하세요."

관련 정보