【问题标题】:Find directories within directories ending in 'l0' that do not contain '*18*' in their names在以“l0”结尾且名称中不包含“*18*”的目录中查找目录
【发布时间】:2020-05-19 03:01:36
【问题描述】:

我目前正在做find . ! -name '*18*' -name '*l0*' -type d,但它仅列出所有父目录,如 'd1_l0' 、 'd2_l0' 、 'd3_l0' 等。我实际上想要像'd1_l0/[15*,16*,17*]'、'd2_l0/[15*,16*,17*]'、'd3_l0/[15*,16*,17*]'这样的子目录/p>

【问题讨论】:

  • 子目录是否也以*l0结尾?如果没有,查询*l0 将不会列出子目录
  • 我实际上正在查询 '*l0*'

标签: linux bash command-line find


【解决方案1】:
find topleveldir/ -mindepth 2 -path "*l0*" ! -path "*18*" -type d

【讨论】:

    【解决方案2】:

    find 的第一个参数是搜索时开始的目录(或多个目录)。如果要查找以l0 结尾的所有目录的子目录,请使用 Bash 通配符选择要搜索的目录:*l0。请注意,通配符不能使用引号。

    要排除包含18 的子目录,请使用'*18*'。这种情况下的引号导致通配符在 find 命令之前不展开。

    您还可以使用-maxdepth-mindepth 谓词。将 maxdepthmindepth 替换为适合您的查询的值。另外,请确保将所有包含谓词放在 ! 之前。

    另外,使用-path 而不是-name 来匹配完整路径。

    find *l0 -maxdepth 1 -mindepth 1 -type d ! -path '*18*'
    

    【讨论】:

    • @MiloMinderbinder 啊,对不起,把它们放在! 之前。请参阅编辑后的答案。
    • 我得到了相同的结果。也尝试了 mindepth 2(这导致没有输出)
    • 我猜我对 find 的看法是完全错误的。你能解释一下为什么我的命令不能正常工作吗?
    • 我明白了.. -name 只匹配路径的最后一部分。如果我们想要匹配整个路径,我们应该使用 -path 而不是 -name。请在您的答案中进行此更改,我会接受并支持它
    • @MiloMinderbinder 更新了我的答案
    【解决方案3】:

    首先,您的第三个谓词不好,如果您想要以l0 结尾的名称,那么您必须使用-name '*l0'(没有最后一个星号)而不是-name '*l0*'(这实际上意味着包含子字符串'l0')

    通过grep(1) 使用管道可能会更容易,因为您可以获得完整的正则表达式支持:

    find . -type d | grep 'l0$' | grep -v '18[^/]*$'
    

    find 只是获取所有子目录,第一个 grep 只保留以 l0 结尾的路径名,最后一个 grep 只是消除了最后一个组件路径中具有子字符串 18 的所有路径(正则表达式 @ 987654331@ 匹配所有18 子字符串,这些子字符串在路径结尾之前跟跟与/ 不同的字符,因此所有这些路径都被消除——通过-v 选项——来自流)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多