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