Я в настоящее время пытаюсь зафиксировать свою систему квоты. Моя проблема состоит в том, что я не могу определить, принадлежат ли все файлы в каталоге тому же пользователю. Если возможно есть ли способ перечислить различных владельцев файлов в каталоге (рекурсивно).
например, get-owners-of DIRNAME
Можно использовать find
распечатать пользователя (владелец) и группа и затем извлечь uniq комбинации, например.
$ 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
stat -c %U *
перечислит владельцев всех файлов.
Это может быть отсортировано и дубликаты, удаленные путем передачи по каналу его в sort -u
:
stat -c %U * | sort -u
Как указано steeldriver, это не рекурсивно. Я пропустил это, относительно этого попросили. Это может быть сделано рекурсивным путем включения globstar:
shopt -s globstar
stat -c %U **/* | sort -u
Alltogether, ответ steeldriver, вероятно, лучше и должен быть принятым ответом здесь :)
Можно найти более эффективным непосредственно искать файлы, не принадлежавшие пользователю...
find /directory ! -user username -printf "%u %p\n"
Сделай сам метод с помощью 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
. . .