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

时间:2017-02-19 23:53:52

标签: linux bash unix

我想要做的是有点难以解释。假设我有一个目录,其中有许多不同的用户向其中提交内容。我要求所有人提供扩展名为“.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

1 个答案:

答案 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,它用作模式和输入的文件。