왜 이런 일이 일어나는가:
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 {}/*' \;
고쳐 쓰다
디렉터리를 삭제할 때 상위 디렉터리를 삭제한 후에는 더 이상 해당 하위 디렉터리를 삭제할 수 없습니다. 하위 디렉터리는 사라졌습니다.