Comment obtenir une liste de tous les propriétaires de fichiers dans un répertoire

14

J'essaie actuellement de réparer mon système de quotas. Mon problème est que je ne peux pas déterminer si tous les fichiers d'un répertoire appartiennent au même utilisateur. Si possible, existe-t-il un moyen de répertorier les différents propriétaires de fichiers dans un répertoire (récursivement).

par exemple get-owners-of DIRNAME

Jack7076
la source
1
Voulez-vous donc répertorier tous les propriétaires uniquement, ou tous les fichiers avec leurs propriétaires, ou tous les fichiers appartenant à une personne autre qu'un utilisateur spécifique?
Byte Commander

Réponses:

25

Vous pouvez utiliser findpour imprimer l'utilisateur (propriétaire) et le groupe, puis extraire les combinaisons uniq, par exemple

$ 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
tournevis
la source
1
Pour évaluer uniquement le contenu du répertoire (et non le / les répertoire (s) racine (s) de la recherche lui-même), ajoutez-le -mindepth 1avant -printf. Et je n'inclurais pas sudodans l'exemple quand OP ne semble pas fonctionner dans un contexte où il est requis.
David Foerster
Cela -t:fait-il une différence dans ce contexte?
kasperd
@kasperd bon point - probablement pas (cela pourrait affecter l'ordre de tri - mais cela ne nous intéresse pas vraiment)
steeldriver
19
stat -c %U * 

répertorie les propriétaires de tous les fichiers.

Cela peut être trié et les doublons supprimés en le canalisant dans sort -u:

stat -c %U * | sort -u

Comme l'a souligné Steeldriver, ce n'est pas récursif. J'ai manqué que cela ait été demandé. Il peut être récursif en activant globstar:

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

Dans l'ensemble, la réponse de Steeldriver est probablement meilleure et devrait être la réponse acceptée ici :)

vidarlo
la source
Cela ne dépassera-t-il pas la longueur de la ligne de commande, s'il y a un grand nombre de fichiers dans la recherche? Si c'est le cas, la réponse de @steeldriver est meilleure.
CSM
@CSM ça va. C'est pourquoi je dis que la réponse des conducteurs d'acier est meilleure dans de nombreux cas.
vidarlo
2
@CSM Je suppose que si ARG_MAXvous pouvez faire un problème printf '%s\0' **/* | xargs -0 stat -c %U(puisqu'il printfs'agit d'un module intégré, il ne devrait pas avoir la même limitation de longueur)
steeldriver
5

Vous trouverez peut-être plus efficace de rechercher directement les fichiers n'appartenant pas à l'utilisateur ...

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

Méthode de bricolage 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])  )

Cela parcourt tous les noms de fichiers répertoriés sur la ligne de commande, obtient l'UID du propriétaire du fichier et l'utilisation du module pwd obtient le nom d'utilisateur du propriétaire. Après cela, le nom de fichier et le nom d'utilisateur ont été joints pour une jolie impression et séparés par deux points. Fonctionne ainsi:

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