Tenho várias pastas compartilhadas e preciso descobrir se um usuário possui várias pastas lá. por exemplo:
/shared/release/
/shared/compile/
/shared/tags/
/shared/general/
Preciso de um script bash que liste essas pastas e me diga se um usuário tem mais de uma pasta própria.
Usando o bash, como posso obter uma lista dessas pastas e determinar se um usuário possui mais de uma?
Responder1
Usando find
:
find /shared -mindepth 1 -maxdepth 1 -type d -user <username>
Substitua <username>
pelo nome de usuário real que você deseja procurar.
-maxdepth 1
irá impedir a travessia recursiva, ou seja, só irá olhar para/shared
o diretório-mindepth 1
impedirá que a listagem do/shared
próprio diretório seja listada se pertencer a<username>
, se você não quiser esse comportamento, remova esta opção-type d
indica que estamos interessados apenas em diretórios-user <username>
indica que estamos procurando os<username>
arquivos de propriedade (diretórios)
Responder2
Isso mostrará quais usuários possuem mais de um diretório:
find /shared -type d -printf '%u\n' | sort | uniq -dc
Isto requer que o GNU find
apoie a -printf
ação. Seu CentOS terá isso.
Isso listará os usuários com mais de um diretório e seus diretórios:
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"
Para máxima flexibilidade, usamos a saída separada por NUL do find
. Para trabalhar com isso, precisamos do GNU awk ou de versões recentes do mawk que suportem entrada separada por NUL. Como você está usando o CentOS, tudo bem.
Como funciona
find /shared -type d -printf '%u %p\0'
Isso diz ao find para procurar diretórios
/shared
e imprimir seu proprietário,%u
, junto com o nome do diretório,%p
em uma lista separada por NUL.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"
Isso conta o número de diretórios que cada usuário possui e imprime um relatório para usuários com mais de um. Em mais detalhes:
c[$1]++
incrementa a contagem para o usuário especificado no primeiro campo de entrada.a[$1]=a[$1](a[$1]?"\n ":"")$0}
salva o nome de cada diretório encontrado para este usuário.END{for (user in c) if (c[user]>1) print c[user],a[user]}
imprime o relatório.RS="\0"
dizawk
para usar entrada separada por NUL. Isso torna o processo seguro mesmo se os nomes dos diretórios contiverem novas linhas ou outros caracteres difíceis.