다른 사용자가 디렉터리에 아무것도 소유하지 않은 경우 해당 사용자가 소유한 최상위 디렉터리를 반환합니다.

다른 사용자가 디렉터리에 아무것도 소유하지 않은 경우 해당 사용자가 소유한 최상위 디렉터리를 반환합니다.

다음 디렉터리 구조와 소유권을 사용합니다.

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.1dir1.2다른 사용자가 이를 소유하지 않기 때문에 반환되지 않습니다 dir1.
  • 마찬가지로 dir2.1.1반품도 없습니다.
  • dir2userB에 속하기 때문에 (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오류로 인해 잘못된 긍정이 발생할 수 있습니다.

관련 정보