Come ottenere un elenco di tutti i proprietari di file in una directory


14

Attualmente sto cercando di riparare il mio sistema di quote. Il mio problema è che non riesco a determinare se tutti i file in una directory appartengono allo stesso utente. Se possibile, esiste un modo per elencare i diversi proprietari dei file in una directory (ricorsivamente).

per esempio get-owners-of DIRNAME


1
Quindi vuoi elencare solo tutti i proprietari, o tutti i file con i loro proprietari, o tutti i file di proprietà di persone diverse da un utente specifico?
Byte Commander

Risposte:


25

È possibile utilizzare findper stampare l'utente (proprietario) e il gruppo e quindi estrarre le combinazioni uniq ad es

$ 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

1
Per valutare solo il contenuto della directory (e non la directory principale / -ies della ricerca stessa) aggiungere -mindepth 1prima -printf. E non includerei sudonell'esempio quando OP non sembra funzionare in un contesto in cui è richiesto.
David Foerster,

Fa la -t:differenza in questo contesto?
Kasperd,

@kasperd buon punto - probabilmente no ( potrebbe influenzare l'ordinamento - ma non ci interessa davvero)
steeldriver

19
stat -c %U * 

elencherà i proprietari di tutti i file.

Questo può essere ordinato e rimosso i duplicati eseguendo il piping in sort -u:

stat -c %U * | sort -u

Come sottolineato da Steeldriver, questo non è ricorsivo. Mi mancava che questo fosse richiesto. Può essere ricorsivo abilitando globstar:

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

Complessivamente, la risposta di steeldriver è probabilmente migliore e dovrebbe essere la risposta accettata qui :)


Non andrà oltre la lunghezza della riga di comando, se nella ricerca è presente un numero elevato di file? In tal caso, la risposta di @steeldriver è migliore.
CSM

@CSM lo farà. Ecco perché dico che la risposta di Steeldrivers è migliore in molti casi.
vidarlo,

2
@CSM Suppongo che ARG_MAXsia un problema che potresti fare printf '%s\0' **/* | xargs -0 stat -c %U(dato che printfè incorporato, non dovrebbe avere la stessa limitazione di lunghezza)
steeldriver

5

Potresti trovare più efficiente la ricerca diretta dei file non di proprietà dell'utente ...

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

4

Metodo fai-da-te tramite 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])  )

Questo scorre su tutti i nomi di file elencati nella riga di comando, ottiene l'UID del proprietario del file e l'utilizzo del modulo pwd ottiene il nome utente del proprietario. Successivamente, nome file e nome utente si sono uniti per una stampa carina e separati da due punti. Funziona così:

$ ./get_owners.py /etc/* 
/etc/acpi:root
/etc/adduser.conf:root
/etc/alternatives:root
. . .
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.