공유 폴더가 여러 개 있는데 사용자가 거기에 폴더를 여러 개 가지고 있는지 확인해야 합니다. 예를 들어:
/shared/release/
/shared/compile/
/shared/tags/
/shared/general/
이러한 폴더를 나열하고 사용자가 2개 이상의 폴더를 소유하고 있는지 알려주는 bash 스크립트가 필요합니다.
Bash를 사용하여 이러한 폴더 목록을 얻고 사용자가 여러 폴더를 소유하고 있는지 어떻게 확인할 수 있습니까?
답변1
사용 find
:
find /shared -mindepth 1 -maxdepth 1 -type d -user <username>
<username>
찾고 있는 실제 사용자 이름으로 바꾸십시오 .
-maxdepth 1
재귀 순회를 방지합니다. 즉,/shared
디렉토리 만 살펴봅니다.-mindepth 1
/shared
소유한 경우 디렉토리 자체가 나열되지 않습니다<username>
. 이 동작을 원하지 않으면 이 옵션을 제거하십시오.-type d
디렉토리에만 관심이 있음을 나타냅니다.-user <username>
<username>
소유한 파일(디렉토리)을 찾고 있음을 나타냅니다.
답변2
그러면 어떤 사용자가 여러 디렉터리를 소유하고 있는지 표시됩니다.
find /shared -type d -printf '%u\n' | sort | uniq -dc
find
이 작업에는 GNU 지원이 필요합니다 -printf
. 귀하의 CentOS에는 이것이 있습니다.
그러면 여러 디렉터리와 해당 디렉터리가 있는 사용자가 나열됩니다.
find /shared -type d -printf '%u %p\0' | awk '{c[$1]++; a[$1]=a[$1](a[$1]?"\n ":"")$0} END{for (user in c) if (c[user]>1) print c[user],a[user]}' RS="\0"
유연성을 극대화하기 위해 NUL로 구분된 출력을 사용합니다 find
. 이를 위해서는 NUL 구분 입력을 지원하는 GNU awk 또는 최신 버전의 mawk가 필요합니다. CentOS를 사용하고 있으므로 괜찮습니다.
어떻게 작동하나요?
find /shared -type d -printf '%u %p\0'
이는 find가 NUL로 구분된 목록에서
/shared
소유자%u
및 디렉토리 이름을 찾아서 인쇄하도록 지시합니다.%p
awk '{c[$1]++; a[$1]=a[$1](a[$1]?"\n ":"")$0} END{for (user in c) if (c[user]>1) print c[user],a[user]}' RS="\0"
이는 각 사용자가 소유한 디렉터리 수를 계산하고 여러 디렉터리를 소유한 사용자에 대한 보고서를 인쇄합니다. 더 자세하게:
c[$1]++
첫 번째 입력 필드에 지정된 사용자 수를 늘립니다.a[$1]=a[$1](a[$1]?"\n ":"")$0}
이 사용자에 대해 찾은 각 디렉터리의 이름을 저장합니다.END{for (user in c) if (c[user]>1) print c[user],a[user]}
보고서를 인쇄하세요.RS="\0"
awk
NUL로 구분된 입력을 사용하도록 지시합니다 . 이렇게 하면 디렉터리 이름에 줄 바꿈이나 기타 어려운 문자가 포함되어 있어도 프로세스가 안전해집니다.