테스트 목적으로 다음 디렉터리를 만들었습니다.
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
검색 경로에 대해 깊이 우선 검색을 수행합니다. 이는 디렉터리에서 실행하면 이미 해당 디렉터리를 방문했으며 다시 액세스를 시도하지 않는다는 의미입니다.find
find
rmdir
이러한 이유로 (has 구현에서) 이 -depth
옵션은 암시적입니다.-delete
find
-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 {} +
이는 완벽하지는 않습니다. 중첩된 디렉터리나 일치하는 디렉터리가 많으면 여전히 오류 메시지가 인쇄될 수 있지만 이는 문제의 간단한 경우에는 작동합니다.