mkdir foodir
find . -iname foodir -exec rm -fr {} \;
작업을 수행하지만 메시지를 뱉어냅니다.
find: `./foodir': No such file or directory
답변1
사건의 정확한 순서는 다음과 같습니다
- 만들다
foodir
- 방사
find
- find는 현재 디렉토리를 읽고 결과를 캐시한 다음 반복하여 foodir에 대한 항목을 찾습니다.
exec
find는 foodir 명령을 시작 하고 foodir을 삭제합니다.- find는 더 이상 존재하지 않는 foodir(find의 내부 캐시에 있음)로 재귀를 시도합니다.
- find는 foodir로 재귀할 수 없다는 경고를 표시합니다.
- find는 다음 항목으로 계속됩니다(이 경우 아마도 디렉토리 항목 목록의 끝이므로 최선을 다해 작업을 수행한 후 종료됩니다).
그래서 당신이 보고 있는 것은 비록 외부 관점에서는 다소 예상치 못한 일이지만 완전히 설명 가능합니다.
캐싱은 거의 확실하게 성능을 향상시켜 파일당 잠재적인 시스템 호출을 많이 줄이고 잠재적인 디스크 I/O를 상당히 절약하기 위해 수행됩니다. 트랜잭션 파일 시스템(일반적이지만 보장되지는 않음)이 없으면 find가 각 항목에 대해 한 번 디렉터리를 읽더라도 특히 로컬이 아닌 파일의 경우 이와 같은 문제가 발생하지 않을 것이라는 보장은 없습니다. 시스템, 심지어주문하다항목 수는 확인 사이에 변경될 수 있으므로 단순히 색인을 추적할 수는 없지만 방문하는 모든 디렉토리 항목을 추적해야 합니다. 대규모 디렉터리 계층 구조에서는 이것이 금세 금지될 수 있습니다.
일반적으로 말하면, 이는 "경쟁 조건": 계산의 전제 조건은 계산 완료와 결과 값 사용 사이에서 변경됩니다.
GNU find의 매뉴얼 페이지를 보면 -ignore_readdir_race
경고를 표시하지 않는 데 도움이 될 수 있는 옵션이 있습니다. 그러나 이것이 find를 통해 실행되는 다른 명령에 얼마나 유용한지는 모르겠습니다. 필요에 따라 이것으로 충분할 수도 있습니다. 표준 오류를 /dev/null(명령줄에 추가)로 리디렉션하여 find에서 오류 및 경고를 표시하지 않을 수도 있지만 2>/dev/null
더 심각한 오류를 숨길 수 있으므로 이 방법은 권장하지 않습니다. 또한 이것이 호출되는 명령의 오류 출력과 어떻게 상호 작용하는지 모르겠습니다.
답변2
find
디렉터리의 내용을 얻으려면 시작 시 대상 디렉터리를 계산합니다. 그런 다음 사용자가 제공한 명령을 처리합니다. 이 경우 항목을 삭제하여 디렉터리의 내용을 변경합니다. 따라서 find
디렉토리에 포함된 내용이 현실과 일치하지 않으며 경고 메시지가 표시됩니다.
답변3
이것은 의미가 있는 것 같습니다. 귀하의 명령은 foodir을 찾은 다음 삭제합니다. 명령의 순서가 메시지의 이유입니다.
답변4
대신 이 명령을 사용하십시오
find . -iname foodir | xargs rm -Rf