컴파일된 데이터를 모두 제거해야 합니다.
- 이름이 인 디렉토리
build
, - 이름이 인 디렉토리
obj
, - *.so 파일.
나는 명령을 썼다
find \( -name build -o -name obj -o -name *.so \) -exec rm -rf {} \;
모든 디렉토리를 재귀적으로 살펴보고 필요한 모든 것을 제거합니다.
왜 이 결과가 나오나요? 어쩌면 다른 명령을 작성해야 할 수도 있습니다.
find: `./3/obj': No such file or directory
find: `./3/build': No such file or directory
find: `./1/obj': No such file or directory
find: `./1/build': No such file or directory
find: `./2/obj': No such file or directory
find: `./2/build': No such file or directory
답변1
-prune
삭제하려는 디렉토리에서 이것을 사용하여 find
해당 디렉토리에서 파일을 찾으려고 애쓰지 않도록 하십시오.
find . \( -name build -o -name obj -o -name '*.so' \) -prune -exec rm -rf {} +
또한 *.so
인용이 필요합니다. 그렇지 않으면 쉘이 이를 .so
현재 디렉토리의 파일 목록으로 확장할 수 있습니다.
GNU 유형과 동등한 것은 다음과 -regex
같습니다:
find . \( -name build -o -name obj -o -name '*?.so' \) -prune -exec rm -rf {} +
GNU 특정 구문을 사용하려면 -delete
대신 을 사용하는 것이 좋습니다 -exec rm -rf {} +
. 을 사용하면 -delete
GNU가 자동으로 find
켜집니다 -depth
. 외부 명령을 실행하지 않으므로 디렉토리를 기호 링크로 변경하여 누군가가 잘못된 파일을 삭제하도록 유도할 수 있는 경쟁 조건을 제거하므로 더 효율적이고 안전합니다 ( 자세한 내용 참조) find
. ).rm
info -f find -n 'Security Considerations for find'
find . -regextype posix-egrep -regex '.*/((obj|build)(/.*)?|.+\.so)' -delete
답변2
find
그 이유는 먼저 디렉토리 트리를 삭제하고 디렉토리 내용을 검사하려고 하기 때문인 것 같습니다 . 이는 분명히 최선의 순서는 아닙니다. find
먼저 내용을 강제로 확인할 수 있습니다 .
find . -depth ...
-delete
파일과 -exec rmdir
디렉터리 에 대해 이 점을 고려해야 합니다 .
답변3
내 솔루션.
find . -regextype posix-egrep -regex ".*/(obj|build|.+\.so)" -prune -exec rm -rf {} +