encontrar pastas de propriedade do usuário

encontrar pastas de propriedade do usuário

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 1irá impedir a travessia recursiva, ou seja, só irá olhar para /sharedo diretório

  • -mindepth 1impedirá que a listagem do /sharedpróprio diretório seja listada se pertencer a <username>, se você não quiser esse comportamento, remova esta opção

  • -type dindica 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 findapoie a -printfaçã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 /sharede imprimir seu proprietário, %u, junto com o nome do diretório, %pem 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"diz awkpara 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.

informação relacionada