查找组与所有者不同的所有文件和目录

查找组与所有者不同的所有文件和目录

我想查找所有具有与所有者不同的组的文件和目录。

因此,如果这是目录中的两个文件,我只想找到第一个文件:

$> 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,statawk。我有一些想法来改进它(find . -exec stat … {} + | awk …),但我不确定我是否可以使它们足够强大以处理可能带有换行符等的文件名。我决定谨慎行事。您可以-print0在需要时使用。这种方法还允许您向 添加更多条件find
  • 在我的 Kubuntu 中,stat -c "%U %G"返回UNKNOWN无法转换为名称的 UID(或 GID)。如果有用户UNKNOWN或组UNKNOWN,我认为这会造成干扰。返回的对象UNKNOWN UNKNOWN被天真地解释为具有匹配的所有者和组。

答案2

好吧,我找到了一个不同的解决方案,它使用lsandawk代替 find。这当然需要并且可以优化。如下:

ls -alR | awk '{ if ($3 != $4) print $0 }'

怎么运行的 :

  • 看什么-alR男人
  • awk搜索模式。
  • $3&$4相应地在 ls 输出中给出第 3和第 4file owner,并且group所有者是其中的一部分。
  • $0在 ls 输出中给出完整的行。
  • 健康)状况if ($3 != $4) print $0解释为“打印包含第 3的值不等于第 4 列的值的所有列的完整行”
  • 完整命令可以解释为仅打印 ls 输出中文件所有者名称和组名称不同的行

限制:

有时,某些文件会出现此错误:

ls: cannot open directory './chatscripts': Permission denied

据我了解,这是执行命令的用户权限问题。该用户既不是该文件的所有者,也不是该文件的组成员,因此无法访问该文件。


您想要的肯定可以通过find命令来完成,但我认为这也可以是一个解决方案,而且如果您使用命令执行此操作,仍然会存在这个权限问题find

请随意添加更多详细信息。

相关内容