find -delete는 비어 있지 않은 디렉토리를 삭제하지 않습니다.

find -delete는 비어 있지 않은 디렉토리를 삭제하지 않습니다.

주문하다

$ find ~ -name .DS_Store -ls -delete

Mac OS X에서 작동하지만

$ find ~ -name __pycache__ -type d -ls -delete

아니요 - 디렉터리를 찾았지만 삭제되지 않았습니다.

왜?

추신.나도 할 수 있다는 걸 알아

$ find ~ -name __pycache__ -type d -ls -exec rm -rv {} +

문제는 find -delete하다아니요일하다.

답변1

find플래그는 -delete다음과 같이 작동합니다.rmdir디렉토리를 삭제할 때. 디렉토리에 도달했을 때 비어 있지 않으면 디렉토리를 삭제할 수 없습니다.

먼저 이 디렉터리를 지워야 합니다. -type d을 지정하고 있으므로 find이 작업은 수행되지 않습니다.

두 번 수행하여 이 문제를 해결할 수 있습니다. 먼저 이름이 지정된 디렉터리의 모든 항목을 삭제한 __pycache__다음 이름이 지정된 모든 디렉터리를 삭제합니다 __pycache__.

find ~ -path '*/__pycache__/*' -delete
find ~ -type d -name '__pycache__' -empty -delete

덜 엄격한 제어이지만 한 줄로 작성됩니다.

find ~ -path '*/__pycache__*' -delete

이렇게 하면 집에서 해당 경로의 일부인 __pycache__모든 항목이 삭제됩니다.

답변2

이에 대한 몇 가지 잠재적인 이유가 있습니다.

1) 디렉터리( )만 삭제하도록 지시하고 -type d해당 디렉터리에는 여전히 파일이 포함되어 있습니다.

2) 귀하의 디렉터리에는 다른 디렉터리만 포함되어 있으므로 -type d콘텐츠 문제가 해결됩니다. 그러나 FreeBSD를 기반으로 하는 OS-X를 사용하고 있으며 FreeBSD는 find기본적으로 디렉터리를 먼저 처리한 다음 그 내용을 처리합니다.
그러나 해당 내용 이후에 디렉토리가 처리되도록 지시하여 이 문제를 해결하는 옵션이 있습니다 -depth.find

find ~ -name __pycache__ -type d -ls -delete -depth

-delete이 옵션은 암시적으로 활성화되어 있으므로 Linux에서는 이 문제가 발생하지 않습니다 -depth.

 

무료 BSD man 1 find:

 -depth  Always true; same as the non-portable -d option. Cause find to
   perform a depth-first traversal, i.e., directories are visited in
   post-order and all entries in a directory will be acted on before
   the directory itself. By default, find visits directories in
   pre-order, i.e., before their contents. Note, the default is not
   a breadth-first traversal.

그누 man 1 find:

 -depth Process each directory's contents before the directory itself. The -delete
        action also implies -depth.

관련 정보