我想查找所有具有与所有者不同的组的文件和目录。
因此,如果这是目录中的两个文件,我只想找到第一个文件:
$> ls -l
-rw-rw-r--. 1 user175 group192 866 Dec 12 2006 index.htm
-rw-r--r--. 1 user175 user175 921 Dec 14 2006 index2.html
我一直在玩 find,但我开始认为我必须放弃并编写某种脚本(我真的不想编写脚本)。
提前致谢。
答案1
find . -exec sh -c '
stat -c "%U %G" "$1" |
awk -F " " "\$1==\$2{exit 1}"
' sh {} \; -print
它stat
针对每个对象运行,检索其所有者和组;awk
然后仅当它们不同时才返回退出状态0
。实际上只打印这些。
笔记:
- 性能很低。每个对象都需要自己单独的
sh
,stat
和awk
。我有一些想法来改进它(find . -exec stat … {} + | awk …
),但我不确定我是否可以使它们足够强大以处理可能带有换行符等的文件名。我决定谨慎行事。您可以-print0
在需要时使用。这种方法还允许您向 添加更多条件find
。 - 在我的 Kubuntu 中,
stat -c "%U %G"
返回UNKNOWN
无法转换为名称的 UID(或 GID)。如果有用户UNKNOWN
或组UNKNOWN
,我认为这会造成干扰。返回的对象UNKNOWN UNKNOWN
被天真地解释为具有匹配的所有者和组。
答案2
好吧,我找到了一个不同的解决方案,它使用ls
andawk
代替 find。这当然需要并且可以优化。如下:
ls -alR | awk '{ if ($3 != $4) print $0 }'
怎么运行的 :
- 看什么
-alR
从男人 - awk搜索模式。
$3
&$4
相应地在 ls 输出中给出第 3列和第 4列file owner
,并且group
所有者是其中的一部分。$0
在 ls 输出中给出完整的行。- 健康)状况
if ($3 != $4) print $0
解释为“打印包含第 3列的值不等于第 4 列的值的所有列的完整行” - 完整命令可以解释为仅打印 ls 输出中文件所有者名称和组名称不同的行。
限制:
有时,某些文件会出现此错误:
ls: cannot open directory './chatscripts': Permission denied
据我了解,这是执行命令的用户权限问题。该用户既不是该文件的所有者,也不是该文件的组成员,因此无法访问该文件。
您想要的肯定可以通过find
命令来完成,但我认为这也可以是一个解决方案,而且如果您使用命令执行此操作,仍然会存在这个权限问题find
。
请随意添加更多详细信息。