我们可以使用以下方法找到目标文件的完整绝对路径寻找关键字。在我的例子中,我需要列出我指定位置的所有直接下一个目录,这些目录可以引导我找到名为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
删除尾随分隔符-d
Delim 用于终止每个输入行,而不是换行符。-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