如何使用shell从路径中删除子目录

时间:2015-02-05 10:18:30

标签: linux shell sed makefile

在make文件中,我想从变量中给出的路径中删除一些子目录。我想我可以使用$(shell ...)来做这件事,所以我认为sed单行或类似行为就可以了。任何合适的make技术都可以。

变量中包含的路径通常如下所示:

/repo/myrepo/products/foo/prod1/test/gtest/bin/XXX

/repo/myrepo/products/cool_products/bar/prod2/test/gtest/bin

我想在prod1prod2之后删除所有内容,并给出结果:

/repo/myrepo/products/foo/prod1
/repo/myrepo/products/cool_products/bar/prod2

换句话说,剥离所有以test/gtest开头的目录,我可以假设它在我将应用它的所有路径中。我无法弄清楚剥离不同数量的子目录的方法。

2 个答案:

答案 0 :(得分:2)

sed 's#/test/gtest.*##g'

这将删除从/test/gtest到结尾的所有内容。

<强>示例:

AMD$ echo "/repo/myrepo/products/foo/prod1/test/gtest/bin/XXX" | sed 's#/test/gtest.*##g'
/repo/myrepo/products/foo/prod1

答案 1 :(得分:1)

另一种可能性,如果你想用GNU make内部的函数来做,而不是通过$(shell ...)调用一个单独的程序,那就像:

FULL_PATH = /repo/myrepo/products/foo/prod1/test/gtest/bin/XXX

STRIPPED_PATH := $(firstword $(subst /test/gtest, ,$(FULL_PATH)))

基本上这说“取$(FULL_PATH)并首先用字符串中出现的空格字符替换字符串/test/gtest,然后返回结果字符串的第一个单词”。