공유 폴더가 여러 개 있는데 사용자가 거기에 폴더를 여러 개 가지고 있는지 확인해야 합니다. 예:
/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
이를 위해서는 GNU가 find
해당 작업을 지원 해야 합니다 -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"
유연성을 극대화하기 위해 find
. 이 작업을 수행하려면 GNU awk 또는 NUL로 구분된 입력을 지원하는 최신 버전의 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로 구분된 입력을 사용하라고 지시합니다 . 이렇게 하면 디렉터리 이름에 줄 바꿈이나 기타 어려운 문자가 포함되어 있어도 프로세스가 안전해집니다.