首页 > 解决方案 > GNU Make:删除第一个点后文件名的所有部分

问题描述

在 GNU Makefile(在 Ubuntu Linux 系统上)中,如何删除列表中每个文件名的文件名后缀,以使文件名在第一个点处被截断?

假设我有

NAMES = file1.a.b.c file2.x.y.z file3.b file4.foo

其中名称可能来自使用$(wildcard file*).

我想结束

NEWNAMES = file1 file2 file3 file4

甚至可能

NEWNAMES = file1.quux file2.quux file3.quux file4.quux

(不一定按此顺序)

$(basename ...)函数仅从名称中删除最后一个后缀。

在支持数组的外壳中,我会使用类似"${names[@]%%.*}"or的东西"${names[@]/%.*/.quux}"


想要这样做的原因是我们正在使用一个生物信息学环境,其中文件具有已知的文件名前缀,但它们的后缀可能是.fa, .fas, .fasta(等)的任意组合,这些后缀可能会加倍(如in .fa.fa) 并且最后还有一个文件压缩器后缀,例如.gz,。

无论初始文件名后缀有多复杂,我们都希望将文件名转换prefix.suffix为 Makefile 中的规范化文件名。

标签: filenamesgnu-make

解决方案


如果你想在不使用 shell 的情况下使用 make 函数,你可以使用这样的东西:

NAMES := $(foreach F,$(wildcard file*),$(firstword $(subst ., ,$F)))

推荐阅读