파일과 디렉터리를 이름별로 삭제합니다. 해당 파일이나 디렉터리가 없습니다.

파일과 디렉터리를 이름별로 삭제합니다. 해당 파일이나 디렉터리가 없습니다.

컴파일된 데이터를 모두 제거해야 합니다.

  • 이름이 인 디렉토리 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 {} +. 을 사용하면 -deleteGNU가 자동으로 find켜집니다 -depth. 외부 명령을 실행하지 않으므로 디렉토리를 기호 링크로 변경하여 누군가가 잘못된 파일을 삭제하도록 유도할 수 있는 경쟁 조건을 제거하므로 더 효율적이고 안전합니다 ( 자세한 내용 참조) find. ).rminfo -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 {} +

+ 및 \; -exec 명령

관련 정보