如何查找目录中有一个文件但没有其他文件的文件所有者

我想要做的是很难解释。 比方说,我有一个不同的用户提交东西的目录。 我要求每个人都有一个扩展名为“.foo”的文件。 然后我要求一个扩展名为“.bar”的文件。 我想要一个提交.foo的人的名字列表,但是没有提交.bar。

我假设你以某种方式使用grep两次,并在grep中包含所有者名称,但这是我感到困惑的地方。 我正试图在一个命令pipe道中完成这一切。

这就是我正在尝试检索名称:

find . -type f -printf "%u %f\n" | grep '%u .foo' | grep -v '%u .bar' 

我的两个问题是, %u不给出printf的名字,排除的bar部分不依赖于grep foo。 这是为了列出所有拥有foo的人的名字,然后删除已经提交的人的名字。

结构按要求:

 |--myDirectory ├── samantha.foo - (owner: samantha warren) ├── samantha.bar - (owner: samantha warren ├── robert.foo - (owner: robert jones) ├── doug.foo - (owner: doug field) ├── doug.bar - (owner: doug field) ├── emily.foo - (owner: emily smith) 

输出应如下所示:

 robert jones emily smith 

在Linux文件所有权意义上, samantha.foo不属于samantha 。 这里的所有权似乎在你的应用程序内。 如果您的文件名包含所有者名称,您可以尝试如下所示:

 # Get all files with extensions foo and bar foos=(*.foo) bars=(*.bar) # Strip the extensions to get the usernames users_with_foo=("${foos[@]%.foo}") users_with_bar=("${bars[@]%.bar}") # Filter the usernames. grep -vxf <(printf "%s\n" "${users_with_bar[@]}") <(printf "%s\n" "${users_with_foo[@]}") 

grep-v打印不符合任何模式的行, -x查找完全匹配(整行必须匹配模式),- -f用于从输入文件读取模式。 在这里,“文件”来自进程替换 ( <(...) )。 所以printf命令的输出作为文件提供给grep ,它用作模式和输入的文件。