"찾기 삭제"가 "깊이"를 의미하는 이유는 무엇입니까?

"찾기 삭제"가 "깊이"를 의미하는 이유는 무엇입니까?

GNU의 매뉴얼 페이지에서는 mean find사용에 대해 명시적으로 경고 하지만 이 요구 사항에 대한 설명을 찾을 수 없습니다.-delete-depth

-delete파일을 삭제합니다. 삭제에 성공하면 true입니다. 삭제에 실패하면 오류 메시지가 표시됩니다. [...] -delete옵션을 사용하여 자동으로 켜십시오 -depth.

find --version
find (GNU findutils) 4.8.0

이는 암시적으로 주문 후 진행입니다.

find /path -type f -delete

그러나 이는 일반적인 순회 방법인 선주문 순회입니다 find.

find /path -type f -exec rm -f {} +

쓰고 싶으면 -prune못쓰고 -delete좀 더 번거로운걸 써야했는데 -exec rm {} +결과는 똑같은 것 같습니다.

-delete작업은 디렉터리를 삭제하지 않는데 왜 find -delete힌트가 필요합니까 -depth?

답변1

-delete작업은 디렉토리를 삭제하지 않는데 find가 -delete이를 암시해야 하는 이유는 무엇입니까 -depth?

GNU 유틸리티의 경우 참조 문서는 매뉴얼 페이지가 아닌 유틸리티의 정보 파일입니다. 어떤 경우에는 질문에 참조된 매뉴얼 페이지가 오해의 소지가 있습니다.find -delete디렉토리를 삭제할 수 있습니다:

파일이나 디렉터리를 삭제합니다. 삭제에 성공하면 true입니다. 삭제에 실패하면 오류 메시지가 표시됩니다.

-deletefind2004년 GNU( findutils4.2.3)에 도입된 이후 디렉터리 삭제를 지원해 왔습니다.

디렉터리를 삭제하는 이유는 이전에 비워진 디렉터리만 삭제할 수 있기 때문 -delete입니다 . 대신 에 해당하는 디렉토리입니다 .-depth-deletermdirrm -rf

find /path -type f -delete두 호출 모두 작업을 파일로 제한하기 때문에 및 의 최종 효과 find /path -type f -exec rm -f {} +는 동일합니다 . find파일만 삭제되므로 삭제 순서는 find순회에 영향을 주지 않습니다. 디렉토리를 삭제할 때 find순회가 작동합니다 . 디렉터리에서 사용하는 경우 -delete디렉터리 자체를 삭제하기 전에 디렉터리의 모든 하위 디렉터리를 처리해야 합니다 -depth. rm -rf탐색 중인 디렉터리에서 사용하는 경우 find삭제된 디렉터리의 하위 디렉터리를 탐색하기 전에 삭제를 알려야 합니다. 이는 -prune이것이 유용한 예입니다.

디렉토리가 삭제되지 않으면 설정되지 않도록 특별하게 만드는 것을 상상할 수 있지만 -depth일반적인 경우 미리 결정하는 것은 불가능합니다. ( -depth작업이 아닌 옵션이므로 첫 번째 작업이 실제로 처리되기 전에 설정해야 합니다.)

또는,과거에 제안한대로, 우리는 특별한 처리가 전혀 필요하지 않고 필요할 때 작업을 수행할 수 -delete있도록 사용자에게 맡기는 것을 상상할 수 있습니다. -delete하지만이로 인해 이전 버전과의 호환성이 손상됩니다.복사된 다른 구현과의 호환성 -delete. 당신은 또한 볼 수 있습니다Savannah 버그 #20865에 대한 토론.

암소 비슷한 일종의 영양findutils -delete명시적 으로 확인-prune버전 4.3.11부터 -depth명시적으로 설정하지 않으면 중단됩니다. 지적된 댓글

-delete술어가 POSIX에 없기 때문에 우리는 그것을 피할 수 있습니다 . 그렇다면 여기서 치명적인 오류를 발생시킬 수는 없습니다.

에서 논의한 바와 같이-delete 옵션을 사용하여 검색하면 /save/ 디렉터리의 파일이 삭제되지만 삭제 옵션 없이 검색하면 해당 파일을 찾지 못하는 이유는 무엇입니까?, GNU를 사용한다면 를 사용해야 find합니다 .-execdir rm {} +-exec rm {} +

관련 정보