bash-使用正则表达式用户选项的查找命令

时间:2018-12-11 08:13:07

标签: bash

我需要使用-user选项(所有者)从目录中获取所有文件,但是用户必须使用user_*之类的正则表达式。此选项(regexp)用于文件名,但我为用户搜索解决方案。对不起,我的英语。

例如-用户(文件所有者):userA,userB,user_1,user_2 ...等

这样的解决方案:

find ./ -type f -user "user_*"

除上述以外,不起作用。

4 个答案:

答案 0 :(得分:3)

此答案基于Aaron's answer。但是,不必再手动列出用户。

compgen -u列出所有用户。 compgen -u user_列出以user_开头的所有用户。如果您想获得更大的灵活性,请使用compgen -u | grep regex

find . -type f \( printf -- '-user %s -o ' $(compgen -u user_) false \) 

答案 1 :(得分:1)

您可以使用-o r来构成谓词:

find ./ -type f \( -user user1 -o -user user2 -o -user user3 \)

不可能使用通配符来选择用户,但是您可以从更特定的通配符生成命令:

find . -type f \( $(printf -- '-user user_%s -o ' {1,2,A,B}) false \)

答案 2 :(得分:1)

对此没有直接支持。从用户名列表中生成命令,或者对find的输出进行后处理。

假设您有GNU find,请尝试

find . -type f -printf '%u\t%p\n' |
grep '^user_' |
cut -f1

如果文件名带有换行符,或者没有GNU find,则失败。您可能可以轻松解决这些限制。要替换GNU扩展-printf,请尝试-exec stat,尽管要传递的确切选项取决于平台。

答案 3 :(得分:0)

find . -type f -exec bash -c 'stat -c "%U %n" "{}"|egrep -e ^user_|cut -d " " -f2-' \;

说明:对于find找到的每个文件,您列出用户名和文件名(stat -c "%U %n" "{}"),然后应用您的regexp规则,在这种情况下,过滤以user_(egrep -e ^user_开头的行)。最后,再次过滤显示第二个字段(cut -d " " -f 2-)开始的结果,该字段在上面的输出中与文件名相对应。

如下所述,stat的参数可能取决于平台,这里我在linux上使用GNU stat。