내 폴더 구조는 다음과 같습니다.
./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
순회하지 마세요. 그렇지 않으면 현재 디렉터리이면 아무 것도 하지 말고, 그렇지 않으면 파일을 삭제하세요."