다음 디렉터리 구조와 소유권을 사용합니다.
userA ./dir1
userA ./dir1/dir1.1
userA ./dir1/dir1.2
userA ./dir2
userA ./dir2/dir2.1
userA ./dir2/dir2.1/dir2.1.1
userB ./dir2/dir2.2
userB ./dir3
실행하면 find . -type d -user userA
다음이 반환됩니다.
./dir1
./dir1/dir1.1
./dir1/dir1.2
./dir2
./dir2/dir2.1
./dir2/dir2.1/dir2.1.1
하지만 나는 이 출력을 보고 싶습니다.
./dir1
./dir2/dir2.1
dir1.1
dir1.2
다른 사용자가 이를 소유하지 않기 때문에 반환되지 않습니다dir1
.- 마찬가지로
dir2.1.1
반품도 없습니다. dir2
userB에 속하기 때문에 (userA에 속하더라도) 반환되지 않습니다dir2.2
.
이는 사용자가 실행하기에 "안전한" 디렉토리를 식별할 수 있도록 디스크 정리에 유용합니다 rm -rf
. 수십억 개의 파일이 있는 경우 du
런타임이 매우 높습니다 . 또한 디렉터리가 모든 계층 구조 수준에 있을 수 있으므로 검색 깊이를 제한하는 것은 도움이 되지 않습니다.
답변1
다음 스크립트를 사용하세요.
#!/bin/sh -
u="$1"
shift
find "$@" -type d -user "$u" ! -exec sh -c '
find "$2" -type d ! -user "$1" | grep -qm 1 .
' find-sh "$u" {} \; -prune -print
사용 예:
/path/to/the_script userA ./
첫 번째 매개변수(여기서는 userA
)는 사용자 이름입니다. 다음의 모든 것(여기 ./
)은 으로 전달됩니다 find
. 시작 경로는 이 방법으로 전달해야 합니다(기술적으로 주입은 가능하지만).
스크립트는 main을 사용하여 find
사용자가 소유한 디렉터리를 찾습니다. 이러한 디렉터리의 경우 find
사용자에게 속하지 않는 하위 디렉터리를 찾는 다른 디렉터리가 호출됩니다. 그렇지 않은 경우 디렉터리를 삭제하고(그래서 main은 find
하위 디렉터리를 확인하지 않습니다) 해당 경로 이름을 인쇄합니다.
노트:
- 내부적으로
find
무엇인가 발견 되면 외부(기본)find
는 디렉토리를 정리하지 않고 대신 하위 디렉토리를 확인합니다. 내부에서 발견된 내용이 깊다 면find
스크립트가 디렉토리 트리의 다른 분기로 이동하기 전에 다양한 수준의 많은 하위 디렉토리를 여러 번 "쓸모 없이" 검사하게 됩니다. 디렉터리 트리가 매우 크지 않은 이상 운영 체제는 메타데이터를 캐시해야 하며 다음에find
동일한 하위 디렉터리를 검사할 때 속도가 빨라야 합니다. 여러 번 확인하는 것은 최적이 아닌 것처럼 보일 수 있지만 이 작업을 최적화하려는 시도는 코드를 복잡하게 만들므로 그럴 가치가 없습니다. grep -m 1
첫 번째 일치 후에 종료하지만 이 옵션은 이식 가능하지 않습니다.grep
지원하지 않는다면 사용-m
하지 마세요(즉, 사용하세요grep -q .
). 스크립트는 속도가 느려지지만 작동합니다.find-sh
설명은 다음과 같습니다.의 두 번째 sh는 무엇입니까sh -c 'some shell code' sh
?- 제목에는 "다른 사용자가 아무것도 소유하지 않은 경우"라고 되어 있지만 예제와 사용 사례에는 "다른 사용자가 하위 디렉터리를 소유하지 않은 경우"라고 나와 있습니다. 내 스크립트는 (하위)디렉토리만 확인합니다. "그렇지 않은 경우..."를 확인하려면
-type d
내부 호출의 테스트를 무시하세요find
. Permission denied
오류로 인해 잘못된 긍정이 발생할 수 있습니다.