如何获取目录中文件的所有所有者的列表


14

我目前正在尝试修复配额系统。我的问题是我无法确定目录中的所有文件是否归同一用户所有。如果可能的话,可以(递归)列出目录中文件的不同所有者。

例如 get-owners-of DIRNAME


1
那么,您是否要仅列出所有所有者,或列出其所有者的所有文件,或列出特定用户以外的任何人拥有的所有文件?
字节指挥官

Answers:


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之前添加-printfsudo当OP在需要的上下文中无法正常工作时,我不会在示例中包括它。
David Foerster '18

-t:在这种情况下是否有所作为?
kasperd '18

@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会的。这就是为什么我说在许多情况下,钢手的答案是更好的答案。
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的DIY方法:

#!/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
. . .
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.