我在用着重击在乌班图和GNU Make 4.2.1。
我正在尝试编写一个 Makefile,它可以对我拥有的一些数据(.TXT 文件)执行简单的操作。我的不同 .TXT 文件存储在 3 个目录 data/dir1 、 data/dir2 和 data/dir3 中。
例如,我希望能够输入 make count_dir1 或 make count_dir2 或 make count_dir3 以获得目录中的总行数。
在不使用 Makefile 的情况下,当我的当前目录是 data/dir1 时,我知道如何执行此操作:
find . -name '*.TXT*' -type f | xargs wc -l
我得到每个文件的行数和总计,这正是我想要的。
现在,就目前而言,我的目标基本上是这样的:
count_dir1: /home/data/dir1
@cd /home/data/dir1 &&\
find . -name '*.TXT*' -type f | xargs wc -l
count_dir2: /home/data/dir2
@cd /home/data/dir2 &&\
find . -name '*.TXT*' -type f | xargs wc -l
count_dir3: /home/data/dir3
@cd /home/data/dir3 &&\
find . -name '*.TXT*' -type f | xargs wc -l
所以,一切正常,但显然,当我确定一个目标就足够时,拥有三个目标是不高效的,但我不知道该怎么做。我假设我必须定义一些变量,例如:
dirs = /home/data/dir1 /home/data/dir2 /home/data/dir3
但随后我不确定如何实现我的目标,并且从我所读到的内容来看,我不认为以这种方式引入变量是一个很好的选择。
先感谢您 ! :)
答案1
如果 gmake 足够符合标准,您可以使用:
DIRS= /home/data/dir1 /home/data/dir2 /home/data/dir3
.PHONY: $(DIRS)
all: $(DIRS)
$(DIRS):
cd $@ && find . -name '*.TXT*' -type f -exec wc -l {} +
.PHONY:
是必需的,因为目录存在并且不依赖于其他目标。
自 1988 年引入“execplus”以来,不推荐使用xargs
with 。find
如果您喜欢长目标名称的简写,您可以添加
count1: /home/data/dir1
count2: /home/data/dir2
count3: /home/data/dir3
到你的makefile。