`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기본적으로 하위 디렉터리로 이동하기 전에 현재 방문 중인 디렉터리의 모든 일치 항목에 작업을 적용합니다.

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

이러한 이유로 사용할 때 옵션이 암시됩니다( 해당 -depth구현 에서 ).-deletefind-delete

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

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

rmdir빈 디렉토리에서만 작동합니다 . 비어 있지 않은 디렉터리가 많으면 위 명령을 실행하면 많은 오류 메시지가 생성됩니다.

대신, find지원하는 경우 다음을 사용하십시오 -empty.

find . -type d -empty -delete

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

find비표준도 없고 -delete다음도 없는 a를 사용합니다 -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 {} +

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

관련 정보