【问题标题】:How to find file owners that have one file in a directory but don't have another如何查找在目录中有一个文件但没有另一个文件的文件所有者
【发布时间】:2017-02-19 23:53:52
【问题描述】:

我想要做的有点难以解释。假设我有一个目录,其中有一堆不同的用户向其中提交内容。我要求每个人提供一个扩展名为“.foo”的文件。然后我向所有人索要了一个扩展名为“.bar”的文件。我想要一份提交 .foo 但未提交 .bar 的所有人的名单。

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

这是我试图检索名称的方法:

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

我的两个问题是%u 没有给出来自printf 的名称,并且排除 bar 部分不依赖于 grep foo。它的意思是列出所有拥有 foo 的人的名字,然后删除提交 bar 的人的名字。

结构按要求:

|--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

【问题讨论】:

  • 多个用户如何在同一个目录下“提交”同一个文件名?每个都会覆盖前一个。
  • 不要让我们猜测您的问题的具体细节。请参阅stackoverflow.com/questions/39338196/…(允许 zipfile VS 就地目录/文件)作为指定与目录/子目录/文件相关的 Q 的绝佳示例。编辑您的 Q 以包含应该是进程的示例文件/目录以及不应处理的示例文件/目录,然后包含您所需的结果。祝你好运。
  • 好节目!很高兴你得到了答案。祝你好运。

标签: linux bash unix


【解决方案1】:

在 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 用于从输入文件中读取模式.在这里,“文件”来自process substitution (&lt;(...))。因此printf 命令的输出作为文件提供给grep,它用作模式和输入的文件。

【讨论】:

  • 谢谢,我不得不稍微调整一下以将其放入一个命令管道中,但它绝对让我得到了正确的答案。你能解释一下printf的过滤过程是如何工作的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 2021-11-13
  • 2011-08-30
  • 2018-12-26
  • 1970-01-01
  • 2012-02-28
相关资源
最近更新 更多