명령
$ find ~ -name .DS_Store -ls -delete
Mac OS X에서 작동하지만
$ find ~ -name __pycache__ -type d -ls -delete
not-디렉토리가 있지만 삭제되지 않았습니다.
왜?
추신. 내가 할 수 있다는 걸 알아
$ find ~ -name __pycache__ -type d -ls -exec rm -rv {} +
문제는 왜 find -delete
작동하지 않는지 입니다.
답변
find
의 -delete
플래그는 rmdir
디렉토리를 삭제할 때 와 유사하게 작동합니다 . 도달했을 때 디렉토리가 비어 있지 않으면 삭제할 수 없습니다.
먼저 디렉토리를 비워야합니다. 당신이 지정되어 있기 때문에 -type d
, find
당신을 위해 그렇게 할 것입니다.
다음 두 단계를 수행하여이 문제를 해결할 수 있습니다. 먼저이라는 dirs 내의 __pycache__
모든 항목을 삭제 한 다음이라는 모든 dirs를 삭제하십시오 __pycache__
.
find ~ -path '*/__pycache__/*' -delete
find ~ -type d -name '__pycache__' -empty -delete
다소 엄격하게 제어되지는 않지만 한 줄로 표시됩니다.
find ~ -path '*/__pycache__*' -delete
이렇게하면 집 안에 __pycache__
경로의 일부인 모든 것이 삭제됩니다 .
답변
이에 대한 몇 가지 잠재적 인 이유가 있습니다.
1)
디렉토리 만 삭제하도록 지시했으며 ( -type d
) 해당 디렉토리에는 여전히 파일이 있습니다.
2)
귀하의 디렉토리에는 다른 디렉토리 만 포함되므로 -type d
내용 문제를 처리합니다. 그러나 대부분 FreeBSD를 기반으로하는 OS-X를 사용하고 있으며 find
기본적으로 FreeBSD 는 디렉토리를 내용보다 먼저 처리합니다.
그러나 해당 내용 이후에 디렉토리를 처리하도록 지시 -depth
하여이 문제를 해결 하는 옵션이 있습니다 find
.
find ~ -name __pycache__ -type d -ls -delete -depth
이 -delete
옵션 은 옵션이 암시 적으로 활성화 하기 때문에 Linux에는 존재하지 않습니다 -depth
.
FreeBSD 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.
GNU man 1 find
:
-depth Process each directory's contents before the directory itself. The -delete action also implies -depth.