GNU Make:在第一个点后删除文件名的所有部分

时间:2019-04-02 09:25:13

标签: filenames 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 ...)函数仅从名称中去除 last 后缀。

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


要执行此操作的原因是,我们正在使用一个生物信息学环境,在该环境中文件具有已知的文件名前缀,但后缀可以是.fa.fas,{{ 1}}(等等),这些后缀可能翻倍(如.fasta),并且最后还带有文件压缩器后缀,例如.fa.fa

我们希望将文件名转换为Makefile中标准化的.gz文件名,而不管初始文件名后缀的复杂程度如何。

3 个答案:

答案 0 :(得分:2)

如果要使用make函数而不使用shell,可以使用以下方法:

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

答案 1 :(得分:1)

我不确定这里针对的平台(我们是否具有SUSv3兼容的/ bin / sh)以及名称上的任何要求。

如果名称中不能包含空格,我认为很简单

NEWNAMES = $(shell for p in $(NAMES); do echo $${p%%.*};done) 

足够接近并且易于理解。

答案 2 :(得分:1)

如果您想要一种更灵活的方法,可以使用gmtt(一种GNUmake库):

include gmtt-master/gmtt-master/gmtt.mk

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

$(info $(foreach fn,$(NAMES),$(call glob-match,$(fn),*.*)$(newline)))

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

$(info $(foreach fn,$(NEWNAMES),$(call glob-match,$(fn),*.*.quux)$(newline)))

输出:

  $ make
 file1 . a.b.c
  file2 . x.y.z
  file3 . b
  file4 . foo

 file1 . middle .quux
  file2 . middle .quux
  file3 . middle .quux
  file4 . more.middle .quux

make: *** Keine Ziele.  Schluss.

glob-matcher返回一个分开的字符串列表,您可以对其进行进一步处理。