Як отримати список усіх власників файлів у каталозі


14

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

напр get-owners-of DIRNAME


1
Отже, ви хочете перерахувати лише всіх власників або всі файли з їх власниками, або всі файли, що належать комусь, окрім конкретного користувача?
Байт-командир

Відповіді:


25

Ви можете використовувати 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

1
Для оцінки лише вмісту каталогів (а не кореневого каталогу / -ій самого пошуку) додайте -mindepth 1раніше -printf. І я б не включив sudoу приклад, коли ОП, здається, не працює в контексті, де це потрібно.
Девід Фоерстер

Чи -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

Alltogether, відповідь steeldriver в , напевно , краще і повинен бути загальноприйнятий відповідь тут :)


Чи не буде це переходити по довжині командного рядка, якщо в пошуку велика кількість файлів? Якщо так, то відповідь @steeldriver краще.
CSM

@CSM це буде. Ось чому я кажу, що відповідь проводників у багатьох випадках є кращою.
vidarlo

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

5

Вам може бути більш ефективним пошук безпосередньо файлів, які не належать користувачеві ...

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

4

Зроби сам метод через 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.