【问题标题】:GNU Make: Remove all parts of filename after first dotGNU Make:删除第一个点后文件名的所有部分
【发布时间】:2019-04-02 09:25:12
【问题描述】:

在 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.fasta 等的任意组合。 ),这些后缀可能会加倍(如.fa.fa),并且最后还有一个文件压缩器后缀,例如.gz

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

【问题讨论】:

    标签: filenames gnu-make


    【解决方案1】:

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

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

    【讨论】:

    • 是的,然后我们可以使用$(addsuffix .quux, $(foreach ... ))。这稍微整洁一些。
    【解决方案2】:

    我不确定这里针对哪些平台(我们是否有符合 SUSv3 的 /bin/sh)以及对名称的任何要求。

    如果名称不能包含空格是可以接受的,我认为很简单

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

    足够接近并且易于理解。

    【讨论】:

    • 对不起,这是在 Ubuntu 上。我已经用缺少的信息更新了问题。我会测试你的答案。
    • 是的,这似乎是一个我们可以使用的简单答案,显然假设文件名没有空格或通配符。暂时接受这个。非常感谢!
    • 你真的应该在这里使用:= 而不是=。如果NEWNAMES 只在一个地方使用,那没什么大不了的,但如果它被全部使用,它可以在运行时产生影响。
    【解决方案3】:

    如果您想要更灵活的方法,可以使用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 返回一个可以进一步处理的分隔字符串列表。

    【讨论】:

      猜你喜欢
      • 2020-05-03
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      相关资源
      最近更新 更多