GNU make,如何确定路径是文件还是目录?

时间:2012-02-25 09:28:05

标签: makefile

从某个路径,我使用

PATHS = $(wildcard $(SOME_PATH)/*)

获取所有子路径。

我需要知道它是文件还是目录。

如何在make中完成?

感谢。

4 个答案:

答案 0 :(得分:8)

约翰马歇尔有一种方法可行,但有一种更安全的方式。所有目录总是有一个众所周知的条目,那就是“。”。所以,你要做的是:

PATHS := $(wildcard $(SOME_PATH)/*)
DIRS := $(patsubst %/.,%,$(wildcard $(addsuffix /.,$(PATHS))))
FILES := $(filter-out $(DIRS),$(PATHS))

通配符将匹配所有目录,并且只匹配目录,因为只有目录包含“。”。这很有用。

Yehnan的方式同样有效,但效率较低,因为你正在为PATHS中的每个元素调用一个shell。这很可能不会影响你的运行时整体,但如果它可以在make内部而不是通过运行shell来完成,我宁愿这样做。它还有助于避免$(shell ...)的可移植性。

答案 1 :(得分:4)

DIRS  := $(patsubst %/,%,$(filter %/,$(wildcard $(SOME_PATH)/*/)))
FILES := $(filter-out $(DIRS),$(wildcard $(SOME_PATH)/*))

看来它也可以只用一个wildcard来完成,如下所示:

ENTRIES := $(wildcard $(SOME_PATH)/*/)
DIRS  := $(patsubst %/,%,$(filter %/,$(ENTRIES)))
FILES := $(filter-out %/,$(ENTRIES))

但我不太相信依赖$(wildcard */)生成文件条目的稳健性,因为它们实际上并不匹配所请求的模式(即,这些条目没有尾部斜杠)。

GNU Make 3.82会产生这样的条目,但它看起来有点像错误而不是功能。

答案 2 :(得分:1)

PATHS = $(wildcard $(SOME_PATH)/*)
DIRPATHS = $(foreach dir, $(wildcard $(PATHS)/*), $(shell test -d $(dir) && echo $(dir)))

答案 3 :(得分:0)

下面的代码在标准bash下工作,如果它是一个目录,则为每个找到的元素打印:

PATHS=$(wildcard *)
for f in $(PATHS); do \
    if test -d $$f; then echo "$$f: DIR"; fi; \
done