찾기를 사용하여 폴더 삭제 - 이상한 메시지

찾기를 사용하여 폴더 삭제 - 이상한 메시지
mkdir foodir
find . -iname foodir -exec rm -fr {} \;

작업을 수행하지만 메시지를 뱉어냅니다.

find: `./foodir': No such file or directory

답변1

사건의 정확한 순서는 다음과 같습니다

  1. 만들다foodir
  2. 방사find
    1. find는 현재 디렉토리를 읽고 결과를 캐시한 다음 반복하여 foodir에 대한 항목을 찾습니다.
    2. execfind는 foodir 명령을 시작 하고 foodir을 삭제합니다.
    3. find는 더 이상 존재하지 않는 foodir(find의 내부 캐시에 있음)로 재귀를 시도합니다.
    4. find는 foodir로 재귀할 수 없다는 경고를 표시합니다.
    5. 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

관련 정보