[unix] 파일 이름과 디렉토리를 삭제하십시오. 그러한 파일이나 디렉토리가 없습니다

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

  • 라는 디렉토리 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



답변

-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


답변

그 이유는 find디렉토리 트리를 먼저 삭제하고 가능한 최선의 순서가 아닌 디렉토리 내용을 확인하려고하기 때문입니다. find먼저 내용을 확인 하도록 할 수 있습니다 .

find . -depth ...

-delete파일 및 -exec rmdir디렉토리 사용 을 고려해야 합니다 .


답변

내 솔루션.

find . -regextype posix-egrep -regex ".*/(obj|build|.+\.so)" -prune -exec rm -rf {} +

+ vs \; -exec 명령에서


답변