find -exec를 사용하여 디렉토리를 삭제하면 오류 메시지가 생성되는 이유는 무엇입니까?

find -exec를 사용하여 디렉토리를 삭제하면 오류 메시지가 생성되는 이유는 무엇입니까?

왜 이런 일이 일어나는가:

find . -type d -name test -exec rm -r {} \;

오류 메시지 생성:

find: ./foo/test: No such file or directory
find: ./bar/test: No such file or directory
find: ./blech/test: No such file or directory

실제로 해당 디렉토리를 삭제하더라도?

OS X(10.10)의 경우입니다.

답변1

readdir()찾기는 디렉토리에서 콘텐츠를 가져오는 데 사용됩니다 .

readdir()은 캐싱을 구현하는 라이브러리 함수이고 find캐싱이 없더라도 호출된 프로그램이 방금 발견한 디렉터리를 삭제했는지 알 수 있는 방법이 없으므로 표준 찾기 호출은 항상 이런 종류의 오류를 발생시킵니다.

문제에 대한 깨끗한 해결책이 있습니다.

find . -depth ...

(...를 find 명령줄의 나머지 부분으로 바꾸세요)

find디렉토리 자체보다 먼저 모든 디렉토리 내용이 처리되도록 지시합니다 .

find참고: 매뉴얼 페이지를 읽는 것이 좋습니다 . 26년 동안 -exec ... {} \;속도가 느리고 클릭할 때마다 하위 프로세스를 생성하는 더 나은 솔루션이 있었습니다 . -exec ... {} +인수의 최대 크기에 도달할 때까지 경로 이름을 수집하면서 찾습니다 .

답변2

원래 질문

-exec최대 뒤의 모든 단어는 \;인수로 해석됩니다. 즉, 명령을 실행하는 셸에 의해 확장되지만( {}이름이 지정된 디렉터리가 존재하면 어떻게 되는지 시도할 수 있습니다), 그런 다음 인용 형식으로 해석됩니다. glob을 확장하려면 쉘이 필요합니다.

find . -type d -exec bash -c 'echo {}/*' \;

고쳐 쓰다

디렉터리를 삭제할 때 상위 디렉터리를 삭제한 후에는 더 이상 해당 하위 디렉터리를 삭제할 수 없습니다. 하위 디렉터리는 사라졌습니다.

관련 정보