在 find 命令中使用 -group 或 -user 通配符

在 find 命令中使用 -group 或 -user 通配符

例如,我正在尝试查找系统上所有以特定名称开头的文件的所有者

[unu@here findtest]$ find . -ls
17295583    0 drwxrwxr-x   2 unu      unu            74 Mar 28 03:14 .
17295584    0 -rw-rw-r--   1 br_asd1  br_asd1         0 Mar 28 03:13 ./test1
17295585    0 -rw-rw-r--   1 br_asd2  br_asd2         0 Mar 28 03:13 ./test2
17295586    0 -rw-rw-r--   1 unu      unu             0 Mar 28 03:13 ./test33
17295587    0 -rw-rw-r--   1 br_bfg1  br_bfg1         0 Mar 28 03:14 ./test11
17295588    0 -rw-rw-r--   1 unu      unu             0 Mar 28 03:14 ./test22

我需要 find 仅获取名称以“br_”开头的用户拥有的文件。

所以我尝试的是

[unu@here findtest]$ find . -user "br_*" -ls
find: ‘br_*’ is not the name of a known user

现在,我发现有效的方法是使用 awk,但我对这种方法有某些问题,并且它对于我正在尝试的内容并不真正有用:

[unu@here findtest]$ find . -ls|awk '{if ($5 ~ "br_"||$6 ~ "br_") print $0}'
17295584    0 -rw-rw-r--   1 br_asd1  br_asd1         0 Mar 28 03:13 ./test1
17295585    0 -rw-rw-r--   1 br_asd2  br_asd2         0 Mar 28 03:13 ./test2
17295587    0 -rw-rw-r--   1 br_bfg1  br_bfg1         0 Mar 28 03:14 ./test11

有没有办法在find 的-user-group选项中添加通配符?

答案1

如果您正在编写,bash可以使用一个数组来保存用户集,并使用另一个数组来生成相应的语法来find匹配这些用户:

#!/bin/bash

# The beginning of the userids we need to match
match=br

# Find the matching set of users
users=($(
    getent passwd |
    awk -F: -vm="$match" 'BEGIN { re = "^" m } $1 ~ re {print $1}'
))

# Build the list of users ("find ( -user XX -o -user YY -o user ZZ ) ...")
finds=()
for user in "${users[@]}"
do
    finds+=('-o' '-user' "$user")
done
[[ ${#finds[@]} -gt 0 ]] && finds=('(' "${finds[@]:1}" ')')

# Execute the find command with the set of users
find . "${finds[@]}" -ls

与以往一样,您可以在find命令前面加上类似的前缀echo,以查看将执行什么。 (或者您可以运行 withbash -x以启用逐行调试报告。)

答案2

如果您需要的只是一个列表,我会选择一个很好的旧grepoverfind的输出。它会慢一些,但打字会少得多。

在最基本的情况下,您可以尝试这个,对于您的示例案例:

find -printf '%u %p\n' | egrep '^br_'

这将为您提供用户拥有的文件列表br_*,每行显示用户名和文件名。

然后,您可以通过调整格式字符串来扩展输出-printf 。

例如,为了使其更像输出ls

find -printf '%-8.8u %-8.8g %M %8s %t %p\n' | egrep '^br_'

保持命令行尽可能短的重要一点是将用户名放在最开始,这样egreps 部分就可以保持简短。

要查看可以在格式字符串中指定的所有内容,请转到这里,然后搜索-printf format.

但请注意,如果您的文件名称中包含换行符,则此解决方案在显示它们时可能会出现问题。

相关内容