我需要使用-user
选项(所有者)从目录中获取所有文件,但是用户必须使用user_*
之类的正则表达式。此选项(regexp)用于文件名,但我为用户搜索解决方案。对不起,我的英语。
例如-用户(文件所有者):userA,userB,user_1,user_2 ...等
这样的解决方案:
find ./ -type f -user "user_*"
除上述以外,不起作用。
答案 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。