从给定位置查找紧邻的下一个目录列表以到达目标文件?

从给定位置查找紧邻的下一个目录列表以到达目标文件?

我们可以使用以下方法找到目标文件的完整绝对路径寻找关键字。在我的例子中,我需要列出我指定位置的所有直接下一个目录,这些目录可以引导我找到名为foo.log

例如,某些路径可能是:

given-location/alpha/beta/gamma/foo.log
given-location/apple/banana/foo.log

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

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

我不想要第一个不同的文件夹,只想要给定位置的直接文件夹。

我的强力方法:

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

答案1

%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[@]}"

下一个示例使用 globstar **/;匹配零个或多个子目录。

#!/bin/bash

shopt -s globstar nullglob
a=()
for b in given-location/**/foo.log; do
    readarray -t -d / -s 1 -n 1 -O ${#a[@]} a <<< "$b"
done
echo "${a[@]}"

将起始索引移动到-O数组末尾可以附加新值。

  • -t删除尾随分隔符
  • -dDelim 用于终止每个输入行,而不是换行符。
  • -s丢弃读取的前几行。
  • -n最多复制 count 行。
  • -O从索引原点开始分配给数组。

答案2

使用 awk 获取字符串的第二个字段:

$ echo 'given-location/alpha/beta/gamma/foo.log' | awk -F/ '{print $2}'
alpha

awk command options used
-F/ : specify '/' as fields separator char
$2  : second field

相关内容