`find -type d -exec rmdir {} \;` 명령이 "해당 파일 또는 디렉터리 메시지가 없습니다"를 생성하는 이유는 무엇입니까?

`find -type d -exec rmdir {} \;` 명령이 "해당 파일 또는 디렉터리 메시지가 없습니다"를 생성하는 이유는 무엇입니까?

테스트 목적으로 다음 디렉터리를 만들었습니다.

user@linux:~$ mkdir dir0{1..3}

user@linux:~$ ls -l
total 12K
drwxr-xr-x 2 user user 4.0K Mei  31 10:45 dir01
drwxr-xr-x 2 user user 4.0K Mei  31 10:45 dir02
drwxr-xr-x 2 user user 4.0K Mei  31 10:45 dir03
user@linux:~$ 

그러다가 삭제했어요find -exec

user@linux:~$ find -type d -exec rmdir {} \;
rmdir: failed to remove '.': Invalid argument
find: ‘./dir02’: No such file or directory
find: ‘./dir01’: No such file or directory
find: ‘./dir03’: No such file or directory
user@linux:~$ 

디렉토리가 삭제되었는지 확인했습니다.

user@linux:~$ ls -l
total 0
user@linux:~$ 

내 질문은 다음과 같습니다

1) 왜 이런 메시지가 있는지 이해가 되지 않습니다. 이유를 아시나요?

rmdir: failed to remove '.': Invalid argument
find: ‘./dir02’: No such file or directory

이 오류가 표시되지 않습니다.rmdir

user@linux:~$ mkdir dir0{1..3}
user@linux:~$ 

user@linux:~$ ls -l
total 12K
drwxr-xr-x 2 user user 4.0K Mei  31 22:58 dir01
drwxr-xr-x 2 user user 4.0K Mei  31 22:58 dir02
drwxr-xr-x 2 user user 4.0K Mei  31 22:58 dir03
user@linux:~$ 

user@linux:~$ rmdir *
user@linux:~$ 

user@linux:~$ ls -l
total 0
user@linux:~$ 

2) 이 메시지를 삭제할 수 있나요?

답변1

방금 삭제한 디렉터리에 들어가려고 하기 find때문에 "해당 파일이나 디렉터리가 없습니다." 오류가 발생합니다 . find기본적으로 하위 디렉터리로 진행하기 전에 현재 방문한 디렉터리에서 일치하는 모든 콘텐츠에 해당 작업을 적용합니다.

make 호출 에 추가하면 -depth검색 경로에 대해 깊이 우선 검색을 수행합니다. 이는 디렉터리에서 실행하면 이미 해당 디렉터리를 방문했으며 다시 액세스를 시도하지 않는다는 의미입니다.findfindrmdir

이러한 이유로 (has 구현에서) 이 -depth옵션은 암시적입니다.-deletefind-delete

find . -depth -type d -exec rmdir {} \;

-depth이 유틸리티의 표준 옵션입니다 find.

rmdir이는 빈 디렉터리에서만 작동한다는 점에 유의하세요 . 비어 있지 않은 디렉터리가 많은 경우 위 명령을 실행하면 많은 오류 메시지가 생성됩니다.

대신 find지원하는 경우 다음을 사용하세요 -empty.

find . -type d -empty -delete

그러면 빈 디렉토리가 삭제됩니다.

다음 중 하나 에는 find비표준이 없습니다 .-delete-emtpy

find . -depth -type d -exec sh -c '
    for dirpath do
        set -- "$dirpath"/*
        [ ! -e "$1" ] && rmdir "$dirpath"
    done' sh {} +

발견된 디렉토리가 비어 있는지 테스트하고 비어 있으면 삭제합니다.

이것은 비어 있지 않은 디렉토리로 인해 일부 오류 메시지가 표시되는 것을 방지하기 위한 긴 코드 조각입니다.생성된 콘텐츠가 "권한 거부" 오류일 수 있으므로 더 흥미로울 수 있기를 바랍니다. 오류를 /dev/null맨 위의 첫 번째 명령 으로 리디렉션하면 이러한 오류가 숨겨집니다.find

답변2

아마도 무슨 일이 일어나고 있는지는 -exec ... \;생성을 통해 find 작업이 단계별로 수행된다는 것입니다.

  • 디렉토리 트리를 탐색하여 일치하는 항목을 찾습니다 -type d.
  • rmdir해당 항목이 발견되는 즉시 실행하십시오.

이는 귀하의 예에서 find가 dir01나중에 입력을 위한 디렉토리로 기억하고 rmdir실행한 다음 재귀하려고 시도할 때 dir01더 이상 존재하지 않기 때문에 실패한다는 것을 의미합니다.

이 경우 다음을 실행하면 도움이 됩니다. -exec rmdir {} +단일 호출이 발행됩니다. rmdir dir01 dir02 dir03이렇게 하면 마지막 세 가지 오류 메시지가 제거됩니다.

오류 메시지 는 현재 디렉터리가 실제로 디렉터리이지만 비어 있지 않기 때문에 삭제할 수 있는 디렉터리가 아니기 .때문입니다 . 그것에 대해 생각하지 않으 려면 다음 명령을 실행하십시오..rmdir-min-depth

find -mindepth 1 -type d -exec rmdir {} +

이는 완벽하지는 않습니다. 중첩된 디렉터리나 일치하는 디렉터리가 많으면 여전히 오류 메시지가 인쇄될 수 있지만 이는 문제의 간단한 경우에는 작동합니다.

관련 정보