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


32

명령

$ 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 작동하지 않는지 입니다.

답변:


36

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__경로의 일부인 모든 것이 삭제됩니다 .


find 4.4.2에서 마지막 명령은 안전 find ~ -path '*/__pycache__*' -delete하거나 아마도 find ~ -path '*/__pycache__/*' -o -name __pycache__ -delete안전해야합니다.
naught101

3
@ naught101,해야 그 find ~ \( -path '*/__pycache__/*' -o -name __pycache__ \) -delete같은 에 우선을 가지고 .
Stéphane Chazelas

6

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

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.

2
예, 그러나 FreeBSD의 find (1)-delete“…이 옵션은 깊이 우선 순회 처리를 의미합니다.” 라고 말하고 GNU find (1) 는“… -delete는 -depth를 의미 합니다. -depth명령 에 추가 해야합니다.
G-남자 '는 분석 재개 모니카'말한다

1
GNU find맨 페이지에서 : "혼동을 막기 위해, 첫 번째 테스트, 위치 옵션 또는 조치 바로 전에 시작점 목록 다음에 명령 행에 글로벌 옵션을 지정해야합니다. 다른 곳에서 글로벌 옵션을 지정하는 경우 혼란 스러울 수 있다는 경고 메시지를 표시합니다. " 이제 주어진 명령에서 -delete"전역 옵션" ~입니다. 또한 추가 여부에 관계없이 아무런 차이가 없다는 것을 알았습니다 -depth. 비어 있지 않은 디렉토리는 삭제되지 유지 (하지만 사용하기 때문에 그것은 아마 -maxdepth너무)
데이비드 Tonhofer에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.