从某个路径,我使用
PATHS = $(wildcard $(SOME_PATH)/*)
获取所有子路径。
我需要知道它是文件还是目录。
如何在make中完成?
感谢。
答案 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