【问题标题】:Find the list of immediate next directory to the current directory for reaching a destination file?查找当前目录的直接下一个目录列表以到达目标文件?
【发布时间】:2021-05-15 08:13:39
【问题描述】:

我们可以使用 find 关键字找到目标文件的完整绝对路径。就我而言,我需要当前位置的所有直接下一个目录的列表,这可以引导我到名为 foo.log

的程序日志文件

例如,一些路径可能是:

current-location/alpha/beta/gamma/foo.log
current-location/apple/banana/foo.log
and so on...

对于上述情况,我需要一个 ['alpha', 'apple'] 列表作为我的结果,因为它包含所有可能的直接下一个文件夹以到达目标文件。

我是 Linux 的新手。我知道,我总是可以创建一个蛮力解决方案,因为我有绝对路径和当前路径,但是任何优化/更好的解决方案或正确方向的任何提示/想法都可以!

编辑:

我不想要第一个不同的文件夹,只想要当前位置的直接文件夹

我的蛮力方法:

   result={}
   for all the Absolute-path which can reach foo.log:
       Suffix-path = (Absolute-path - current-path)
       Append the Suffix-path[0] to result

【问题讨论】:

  • 你输入的current-location部分是绝对路径吗? current-locationpwd 的输出一样吗?请在您的问题中澄清这一点并展示一个更好的例子。输入是find 命令打印的一些输出吗?然后显示您使用的find 命令。使用 shell 变量扩展很容易去除前导或尾随字符串。或许可以修改find 命令以使其更容易。
  • 是的,当前位置是一个绝对路径,我认为问题陈述和预期答案都提到了很清楚
  • 请在问题中添加所有说明,而不是在 cmets 中回答。当然,您的问题对您来说很清楚,但对其他人来说不一定。对我来说,除了您在文本中提到它之外,您的问题与find 标签有何关系并不清楚。据我所知,find 命令只有在您提供绝对路径作为起点参数时才会打印绝对路径。也不清楚您所说的“['alpha', 'apple'] 列表”是什么意思。一个看起来像这个例子的字符串? bash 脚本中的数组? Python 脚本中的列表?
  • 我们是否需要将它像列表/数组/或其他任何东西返回到解决此问题所需的逻辑?还 find 命令正在帮助我提到的蛮力解决方法?耸耸肩? @Bodo
  • 这显然会增加解决方案的复杂性,是的;逗号分隔的列表比方括号括起来的列表和单引号中的元素更容易输出。如果没有格式化细节find -name foo.log|awk -F'/' '{print $2}' 就足够了,因为,鉴于您提供的“示例数据”,当在current-location 中执行时,它会吐出alphaapple。仅仅因为您的问题罗嗦并不能说明问题。

标签: linux directory path find


【解决方案1】:

怎么样(有点过于冗长):

find . -type f -name 'foo.log' | sed -nE "s#[^/]+/([^/]+)/.*#\1#p;s#.*#'&'#" | paste -sd, - | sed -s 's/^/[/;s/$/]/'

或者:

find . -type f -name 'foo.log' -printf '%d %p\n' |awk -F '[ /]' '$1>1 {list=sprintf("%s\047%s\047", ((!list)?"":list ","),$3)} END {print "[" list "]"}'

【讨论】:

    【解决方案2】:

    只是@vgersh99 答案的简单版本,概念是一样的(%P 格式指令会直接在起点之后给你路径):

    find given-location/ -type f \
      -name 'foo.log' -printf %P\\n | cut -f1 -d /
    

    您可以使用 += 运算符将 find 的输出附加到数组中:

    a=(); a+=( \
      $(find given-location/ -type f \
           -name 'foo.log' -printf %P\\n | cut -f1 -d / \
      ) \
    ); echo "${a[@]}"
    

    【讨论】:

      猜你喜欢
      • 2020-05-21
      • 2011-07-05
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      • 2011-01-30
      相关资源
      最近更新 更多