Cómo obtener una lista de todos los propietarios de archivos en un directorio

14

Actualmente estoy tratando de arreglar mi sistema de cuotas. Mi problema es que no puedo determinar si todos los archivos en un directorio son propiedad del mismo usuario. Si es posible, hay una manera de enumerar los diferentes propietarios de archivos en un directorio (recursivamente).

p.ej get-owners-of DIRNAME

Jack7076
fuente
1
Entonces, ¿desea enumerar todos los propietarios únicamente, o todos los archivos con sus propietarios, o todos los archivos propiedad de otra persona que no sea un usuario específico?
Byte Commander

Respuestas:

25

Puede utilizar findpara imprimir el usuario (propietario) y el grupo y luego extraer las combinaciones uniq, por ejemplo

$ sudo find /var -printf '%u:%g\n' | sort -t: -u
_apt:root
avahi-autoipd:avahi-autoipd
clamav:adm
clamav:clamav
colord:colord
daemon:daemon
lightdm:lightdm
lp:lp
man:root
root:adm
root:crontab
root:lp
root:mail
root:mlocate
root:root
root:shadow
root:staff
root:syslog
root:utmp
root:whoopsie
speech-dispatcher:root
statd:nogroup
steeldriver:crontab
steeldriver:lightdm
steeldriver:steeldriver
syslog:adm
systemd-timesync:systemd-timesync
testuser:crontab
conductor de acero
fuente
1
Para evaluar solo el contenido del directorio (y no el directorio raíz / s de la búsqueda en sí), agregue -mindepth 1antes -printf. Y no incluiría sudoen el ejemplo cuando OP no parece funcionar en un contexto donde se requiere.
David Foerster
¿ -t:Hay alguna diferencia en este contexto?
kasperd
@kasperd buen punto - probablemente no ( podría afectar el orden de clasificación, pero no estamos realmente interesados ​​en eso)
steeldriver
19
stat -c %U * 

enumerará los propietarios de todos los archivos.

Esto se puede ordenar y eliminar los duplicados al conectarlo a sort -u:

stat -c %U * | sort -u

Como señaló Steeldriver, esto no es recursivo. Extrañé que esto fuera solicitado. Se puede hacer recursivo habilitando globstar:

shopt -s globstar
stat -c %U **/* | sort -u

En conjunto, la respuesta de Steeldriver es probablemente mejor y debería ser la respuesta aceptada aquí :)

vidarlo
fuente
¿Eso no excederá la longitud de la línea de comando si hay una gran cantidad de archivos en la búsqueda? Si es así, entonces la respuesta de @steeldriver es mejor.
CSM
@CSM lo hará. Es por eso que digo que la respuesta de Steeldrivers es mejor en muchos casos.
vidarlo
2
@CSM supongo que si ARG_MAXes un problema que podría hacer printf '%s\0' **/* | xargs -0 stat -c %U(ya que printfes una orden interna, no debe tener la misma limitación de longitud)
steeldriver
5

Puede que le resulte más eficiente buscar directamente los archivos que no son propiedad del usuario ...

find /directory ! -user username -printf "%u %p\n" 
rrauenza
fuente
4

Método de bricolaje a través de Python:

#!/usr/bin/env python3
import sys,os,pwd
for f in sys.argv[1:]:
    username = pwd.getpwuid(os.stat(f).st_uid).pw_name
    print( ":".join([f,username])  )

Esto itera sobre todos los nombres de archivo enumerados en la línea de comandos, obtiene el UID del propietario del archivo, y el uso del módulo pwd obtiene el nombre de usuario del propietario. Después de eso, el nombre de archivo y el nombre de usuario se unieron para una impresión bonita y se separaron por dos puntos. Funciona así:

$ ./get_owners.py /etc/* 
/etc/acpi:root
/etc/adduser.conf:root
/etc/alternatives:root
. . .
Sergiy Kolodyazhnyy
fuente