Como obter uma lista de todos os proprietários de arquivos em um diretório

14

Atualmente, estou tentando corrigir meu sistema de cotas. Meu problema é que não consigo determinar se todos os arquivos em um diretório pertencem ao mesmo usuário. Se possível, existe uma maneira de listar os diferentes proprietários de arquivos em um diretório (recursivamente).

por exemplo get-owners-of DIRNAME

Jack7076
fonte
1
Deseja listar apenas todos os proprietários ou todos os arquivos com seus proprietários ou todos os arquivos pertencentes a alguém que não seja um usuário específico?
Byte Commander

Respostas:

25

Você pode usar findpara imprimir o usuário (proprietário) e o grupo e extrair as combinações uniq, por exemplo

$ 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
chave de aço
fonte
1
Para avaliar apenas o conteúdo do diretório (e não o (s) diretório (s)-raiz da própria pesquisa), adicione -mindepth 1antes -printf. E eu não incluiria sudono exemplo quando o OP não parece funcionar em um contexto em que é necessário.
David Foerster
Faz -t:diferença neste contexto?
precisa saber é o seguinte
@kasperd bom ponto - provavelmente não (isso pode afetar a ordem de classificação - mas não estamos realmente interessados em que)
steeldriver
19
stat -c %U * 

listará os proprietários de todos os arquivos.

Isso pode ser classificado e as duplicatas removidas, canalizando-o para sort -u:

stat -c %U * | sort -u

Como apontado pela chave de aço, isso não é recursivo. Eu perdi que isso foi solicitado. Pode tornar-se recursivo ativando a globstar:

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

No geral, a resposta da steeldriver provavelmente é melhor e deve ser a resposta aceita aqui :)

vidarlo
fonte
Isso não excederá o comprimento da linha de comando, se houver um grande número de arquivos na pesquisa? Nesse caso, a resposta do @steeldriver é melhor.
CSM
@CSM vai. É por isso que digo que a resposta dos siderúrgicos é melhor em muitos casos.
Vidarlo 21/04/19
2
@CSM Eu acho que se ARG_MAXé uma questão que você poderia fazer printf '%s\0' **/* | xargs -0 stat -c %U(uma vez que printfé um builtin, não deve ter a mesma limitação de comprimento)
steeldriver
5

Você pode achar mais eficiente procurar diretamente os arquivos que não pertencem ao usuário ...

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

Método DIY via 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])  )

Isso itera sobre todos os nomes de arquivos listados na linha de comando, obtém o UID do proprietário do arquivo e, usando o módulo pwd , obtém o nome de usuário do proprietário. Depois disso, o nome do arquivo e o nome de usuário se juntaram para uma bonita impressão e foram separados por dois pontos. Funciona assim:

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