我想要做的是有点难以解释。假设我有一个目录,其中有许多不同的用户向其中提交内容。我要求所有人提供扩展名为“.foo”的文件。然后我向大家索要一个扩展名为“.bar”的文件。我想要一个提交.foo的所有人的名单,但是没有提交.bar。
我假设你以某种方式使用grep两次并在grep中包含所有者名称,但这就是我感到困惑的地方。我试图在一个命令管道中完成所有这些。
我正在尝试检索名称:
find . -type f -printf "%u %f\n" | grep '%u .foo' | grep -v '%u .bar'
我的两个问题是%u
没有给出printf
的名称,并且排除栏部分不依赖于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
答案 0 :(得分:2)
从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
查找完全匹配(整行必须与模式匹配)和{{1} }用于从输入文件中读取模式。在这里,&#34;文件&#34;来自process substitution(-f
)。所以<(...)
命令&#39;输出作为文件提供给printf
,它用作模式和输入的文件。