在Linux上列出文件夹中的文件所有者列表。

11

我有一个包含许多文件的文件夹,这些文件是由许多不同的用户创建的。我不知道如何使用shell脚本。

我需要获取文件所有者的用户名(仅限用户名)列表。

我可以使用ls -l命令保存输出结果,然后使用perl、python等进行解析...

但是,如何使用shell脚本实现这一点呢?

3个回答

10
stat -c "%U" *| sort -u

9
一个简单的例子是:
ls -l /some/dir/some/where | awk '{print $3}' | sort | uniq

获得一个唯一的、已排序的所有者列表。

1
@gmeben:自从空格被认为是奇怪的了? - Daniel Kamil Kozar
2
@DanielKamilKozar 或许这不算奇怪,但如果您允许系统文件名中存在空格,则可能存在更大的问题。 - user110857
1
要递归地遍历目录,请在ls命令中添加R开关:ls -lR /some/dir/some/where | awk '{print $3}' | sort | uniq - Abdull
还有这种写法,你觉得怎么样:ls -laR * 2>/dev/null | grep -E "^[-bcdlps][^ ][^ ][^ ][^ ][^ ][^ ][^ ][^ ][^ ] " | awk '{print $3,$4}' | sort | uniq。任何简化都是受欢迎的... - Digger
1
人们,人们——这就是“find”命令的本意。尝试像这样使用:find /some/dir/some/where -execdir stat -c "%U" {} + | sort | uniq - CivFan
显示剩余2条评论

5
目前为止,这两种解决方案都不错,但它们都有其局限性。
这将确保您正确地递归搜索目录树中的每个文件。
sudo find /some/dir/ -exec stat -c "%U" {} + | sort | uniq

换句话说,以尽可能少的stat调用为目标,在目录/some/dir中递归搜索文件,并在文件上执行stat -c "%U"(打印用户名),然后当然要sort这些用户名的列表,再筛选出唯一的用户名集合。

要仅限于搜索普通文件,则添加-type f子句:
sudo find /some/dir/ -type f -exec stat -c "%U" {} + | sort | uniq
                     _______

2
在Freebsd上:find /some/dir/ -type f -exec stat -f "%Su" {} + | sort | uniq。OP只寻找文件,因此我添加了-type f - simlev
@simlev 我认为在Linux中,“文件”是目录中任何这样的东西的通用名称,包括目录,它们只是特殊的文件。如果只想查找“常规文件”,那么是的,请添加-type f - CivFan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接