Как получить список всех владельцев файлов в каталоге


14

В настоящее время я пытаюсь исправить свою систему квот. Моя проблема в том, что я не могу определить, все ли файлы в каталоге принадлежат одному и тому же пользователю. Если возможно, есть ли способ перечислить разных владельцев файлов в каталоге (рекурсивно).

например get-owners-of DIRNAME


1
Итак, вы хотите перечислить только всех владельцев, или все файлы с их владельцами, или все файлы, принадлежащие кому-либо, кроме определенного пользователя?
Byte Commander

Ответы:


25

Вы можете использовать findдля печати пользователя (владельца) и группы, а затем извлечь уникальные комбинации, например

$ 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
Чтобы оценить только содержимое каталога (а не корневой каталог / -и самого поиска), добавьте -mindepth 1перед -printf. И я бы не стал включать sudoв пример, когда OP не работает в контексте, где это требуется.
Дэвид Фёрстер

Имеет ли -t:значение в этом контексте?
kasperd

@kasperd хорошая мысль - вероятно, нет (это может повлиять на порядок сортировки - но мы не очень заинтересованы в этом)
steeldriver

19
stat -c %U * 

перечислит владельцев всех файлов.

Это можно отсортировать и удалить дубликаты, отправив их в sort -u:

stat -c %U * | sort -u

Как отмечает Steeldriver, это не рекурсивно. Я пропустил, что об этом просили. Это можно сделать рекурсивным, включив globstar:

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

В целом, ответ SteelDriver, вероятно, лучше и должен быть принятым ответом здесь :)


Разве это не будет превышать длину командной строки, если в поиске много файлов? Если так, то ответ @steeldriver лучше.
CSM

@CSM это будет. Вот почему я говорю, что ответ сталелитейщиков во многих случаях лучше.
Видарло

2
@ CSM Я думаю, если ARG_MAXэто проблема, которую вы могли бы решить printf '%s\0' **/* | xargs -0 stat -c %U(поскольку printfона встроенная, у нее не должно быть такого же ограничения длины)
steeldriver

5

Вы можете найти более эффективным прямой поиск файлов, не принадлежащих пользователю ...

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

4

DIY метод с помощью 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])  )

Это перебирает все имена файлов, перечисленные в командной строке, получает UID владельца файла, а с помощью модуля pwd получает имя пользователя владельца. После этого имя и имя пользователя объединяются для удобной печати и разделяются двоеточием. Работает так:

$ ./get_owners.py /etc/* 
/etc/acpi:root
/etc/adduser.conf:root
/etc/alternatives:root
. . .
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.