我想要做的是很难解释。 比方说,我有一个不同的用户提交东西的目录。 我要求每个人都有一个扩展名为“.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
,它用作模式和输入的文件。