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입니다. 삭제에 실패하면 오류 메시지가 표시됩니다.
-delete
find
2004년 GNU( findutils
4.2.3)에 도입된 이후 디렉터리 삭제를 지원해 왔습니다.
디렉터리를 삭제하는 이유는 이전에 비워진 디렉터리만 삭제할 수 있기 때문 -delete
입니다 . 대신 에 해당하는 디렉토리입니다 .-depth
-delete
rmdir
rm -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 {} +