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 1
evitará el recorrido recursivo, es decir, solo mirará el/shared
directorio-mindepth 1
evitará que el/shared
directorio en sí aparezca en la lista si es propiedad de<username>
, si no desea este comportamiento, elimine esta opción-type d
indica 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 find
respalde la -printf
acció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
/shared
e imprima su propietario,%u
junto con el nombre del directorio,%p
en 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"
indicaawk
que 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.