Jak uzyskać listę wszystkich właścicieli plików w katalogu

14

Obecnie próbuję naprawić mój system przydziałów. Mój problem polega na tym, że nie mogę ustalić, czy wszystkie pliki w katalogu są własnością tego samego użytkownika. Jeśli to możliwe, istnieje sposób na wylistowanie różnych właścicieli plików w katalogu (rekurencyjnie).

na przykład get-owners-of DIRNAME

Jack7076
źródło
1
Czy chcesz więc wymienić tylko wszystkich właścicieli, wszystkie pliki z ich właścicielami, czy wszystkie pliki należące do kogoś innego niż określony użytkownik?
Bajt Dowódca

Odpowiedzi:

25

Możesz użyć finddo wydrukowania użytkownika (właściciela) i grupy, a następnie wyodrębnić kombinacje uniq, np

$ 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
steeldriver
źródło
1
Aby ocenić tylko zawartość katalogu (a nie katalog główny / same wyszukiwania), dodaj -mindepth 1wcześniej -printf. I nie zawarłbym sudow tym przykładzie, gdy OP wydaje się nie działać w kontekście, w którym jest to wymagane.
David Foerster,
Czy -t:robi to różnicę w tym kontekście?
kasperd
@kasperd dobry punkt - prawdopodobnie nie ( może to wpłynąć na porządek sortowania - ale tak naprawdę nie jesteśmy tym zainteresowani)
steeldriver
19
stat -c %U * 

wyświetli listę właścicieli wszystkich plików.

Można to posortować i usunąć duplikaty, przesyłając je do sort -u:

stat -c %U * | sort -u

Jak zauważył Steeldriver, nie jest to rekurencyjne. Tęskniłem za tym, o co mnie proszono. Można go rekurencyjnie włączyć globstar:

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

Podsumowując, odpowiedź steeldrivera jest prawdopodobnie lepsza i powinna być tutaj odpowiedzią przyjętą :)

vidarlo
źródło
Czy to nie przekroczy długości wiersza polecenia, jeśli podczas wyszukiwania jest duża liczba plików? Jeśli tak, to odpowiedź @steeldriver jest lepsza.
CSM
@CSM będzie. Dlatego mówię, że odpowiedź steeldrivers jest lepsza w wielu przypadkach.
vidarlo
2
@CSM Chyba, że ARG_MAXjest to problem, który możesz zrobić printf '%s\0' **/* | xargs -0 stat -c %U(ponieważ printfjest wbudowany, nie powinien mieć takiego samego ograniczenia długości)
Steeldriver
5

Bardziej efektywne może być bezpośrednie wyszukiwanie plików nie należących do użytkownika ...

find /directory ! -user username -printf "%u %p\n" 
rrauenza
źródło
4

Metoda majsterkowania za pomocą Pythona:

#!/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])  )

Powoduje to iterację wszystkich nazw plików wymienionych w wierszu poleceń, pobiera identyfikator UID właściciela pliku, a przy użyciu modułu pwd otrzymuje nazwę użytkownika właściciela. Następnie nazwa pliku i nazwa użytkownika dołączyły się do ładnego drukowania i zostały rozdzielone dwukropkiem. Działa tak:

$ ./get_owners.py /etc/* 
/etc/acpi:root
/etc/adduser.conf:root
/etc/alternatives:root
. . .
Sergiy Kolodyazhnyy
źródło