buscar carpetas propiedad del usuario

buscar carpetas propiedad del usuario

Tengo varias carpetas compartidas y necesito saber si un usuario tiene varias carpetas allí. p.ej:

/shared/release/
/shared/compile/
/shared/tags/
/shared/general/

Necesito un script bash que enumere esas carpetas y me diga si un usuario tiene más de una carpeta propia.

Usando bash, ¿cómo puedo obtener una lista de estas carpetas y determinar si un usuario posee más de una?

Respuesta1

Usando find:

find /shared -mindepth 1 -maxdepth 1 -type d -user <username>

Reemplace <username>con el nombre de usuario real que desea buscar.

  • -maxdepth 1evitará el recorrido recursivo, es decir, solo mirará el /shareddirectorio

  • -mindepth 1evitará que el /shareddirectorio en sí aparezca en la lista si es propiedad de <username>, si no desea este comportamiento, elimine esta opción

  • -type dindica que solo estamos interesados ​​en directorios

  • -user <username>indica que estamos buscando los <username>archivos propios (directorios)

Respuesta2

Esto mostrará qué usuarios tienen más de un directorio:

find /shared -type d -printf '%u\n' | sort | uniq -dc

Esto requiere que GNU findrespalde la -printfacción. Tu CentOS tendrá esto.

Esto enumerará tanto los usuarios con más de un directorio como sus directorios:

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 lograr la máxima flexibilidad, utilizamos salida separada por NUL de find. Para trabajar con esto, necesitamos GNU awk o versiones recientes de mawk que admitan entradas separadas por NUL. Como estás usando CentOS, esto debería estar bien.

Cómo funciona

  • find /shared -type d -printf '%u %p\0'

    Esto le indica a Find que busque directorios /sharede imprima su propietario, %ujunto con el nombre del directorio, %pen una 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"

    Esto cuenta la cantidad de directorios que tiene cada usuario e imprime un informe para los usuarios con más de uno. Con más detalle:

    • c[$1]++incrementa el recuento para el usuario especificado en el primer campo de entrada.

    • a[$1]=a[$1](a[$1]?"\n ":"")$0}guarda el nombre de cada directorio encontrado para este usuario.

    • END{for (user in c) if (c[user]>1) print c[user],a[user]}imprime el informe.

    • RS="\0"indica awkque se utilice una entrada separada por NUL. Esto hace que el proceso sea seguro incluso si los nombres de los directorios contienen nuevas líneas u otros caracteres difíciles.

información relacionada