"rm -rf"를 사용하면 "디렉터리가 비어 있지 않습니다"라는 메시지가 나타나는 이유는 무엇입니까?

"rm -rf"를 사용하면 "디렉터리가 비어 있지 않습니다"라는 메시지가 나타나는 이유는 무엇입니까?

저는 macOS 및 rmGNU coreutils(macOS 자체 도구 아님 rm)의 도구를 사용합니다.

그래서 다음과 같은 일부 디렉토리를 정리하는 스크립트가 있습니다.

if [ -d "${cleanup_repo_clone_root}" ]; then
    echo "Cleaning up tmp directory: ${cleanup_repo_clone_root}"
    set -x; rm -rf -- "${cleanup_repo_clone_root}"
fi

나는 set -x무슨 일이 일어났는지 보기 위해 하나를 던졌다.

출력이 표시됩니다.

+ set -x
+ rm -rf -- /var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ
rm: cannot remove '/var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ': Directory not empty

하지만 해당 rm 명령을 복사하여 붙여넣고 실행하면 제대로 작동합니다!

$ rm -rf -- /var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ

여기서 무슨 일이 일어나고 있는 걸까요?

답변1

rm여러 파일이나 디렉터리에서 작업할 때의 작업은 원자적이지 않습니다. 이 경우 rm -r파일과 디렉터리가 아래에서 위로 검색되어 루트까지 요청된 경로의 리프에서 제거되기 때문에 이것이 중요합니다 . 아무것도 남지 않을 때까지 unlinking 및 ing를 수행한 다음 최종 디렉토리를 수행합니다 .rmdirrmdir

이러한 일은 순서대로 발생하므로 를 내보내기 전에 더 많은 파일이 생성되면 rmdir다시 돌아옵니다 ENOTEMPTY("디렉토리가 비어 있지 않습니다").

시스템에서 실행 중인 스크립트나 다른 프로세스가 와 상호 작용할 가능성이 높습니다 rm -rf.

  1. 비동기식 대신 동기식으로 수행하거나
  2. ENOTEMPTY로 인해 실패하면 다시 시도하십시오. rm -rf(디렉토리가 그 아래에서 제거되었기 때문에 다른 응용 프로그램이 실패할 수도 있지만)

fanotifyopensnoop유사한 eBPF 스크립트를 사용하여 다음과 같은 파일을 생성하는 다른 애플리케이션을 찾을 수 있습니다.숨은참조. inotify도움이 될 수도 있지만 안타깝게도 출력에 파일을 생성하는 프로세스가 포함되어 있지 않습니다.

또 다른 가능성은 파일 삭제에 실패했지만 차단되었을 수 있다는 것입니다 . 이 경우 어떤 오류가 발생할 수 있는지 확인하려면 -f파일 없이 실행해 보세요 .-f

답변2

open $dir이전에 제가 한 호출은 제가 삭제하려는 디렉터리의 하위 디렉터리 중 하나에서 macOS Finder(파일 탐색기 데스크톱 앱)를 실행하는 것이었습니다 .

Directory not empty삭제하려는 디렉터리에 파일/디렉터리를 잠그는 프로세스가 있는 경우 macOS에서 이 알 수 없는(ENOEMPTY) 오류가 발생하는 것 같습니다.

관련 정보