從一些路徑,我用GNU make,如何確定路徑是文件還是目錄?
PATHS = $(wildcard $(SOME_PATH)/*)
得到所有子路徑。
我需要知道它是文件還是目錄。
如何在make中做到這一點?
謝謝。下面
從一些路徑,我用GNU make,如何確定路徑是文件還是目錄?
PATHS = $(wildcard $(SOME_PATH)/*)
得到所有子路徑。
我需要知道它是文件還是目錄。
如何在make中做到這一點?
謝謝。下面
約翰馬歇爾有一種方法可行,但有一種更安全的方法。所有的目錄總是有一個衆所周知的條目,那就是「。」。所以,你需要做的是:
PATHS := $(wildcard $(SOME_PATH)/*)
DIRS := $(patsubst %/.,%,$(wildcard $(addsuffix /.,$(PATHS))))
FILES := $(filter-out $(DIRS),$(PATHS))
通配符將匹配所有目錄,並且只匹配目錄,因爲只有目錄包含「。」。這是健壯的。
Yehnan的方法也可以工作,但效率較低,因爲您正在爲PATHS中的每個元素調用一個shell。這很可能不會對整個運行時間產生很大的影響,但如果可以在內部完成而不是通過運行shell,我寧願這樣做。它還有助於避免$(shell ...)的可移植性。
代碼工作在一個標準的bash
並打印找到的元素,如果它是一個目錄:
PATHS=$(wildcard *)
for f in $(PATHS); do \
if test -d $$f; then echo "$$f: DIR"; fi; \
done
PATHS = $(wildcard $(SOME_PATH)/*)
DIRPATHS = $(foreach dir, $(wildcard $(PATHS)/*), $(shell test -d $(dir) && echo $(dir)))
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))
但我不太確信取決於的穩健性來生成文件的條目,因爲它們實際上並不匹配所請求的模式(即,這樣的條目沒有結尾的斜線)。
GNU Make 3.82確實產生了這樣的條目,但它看起來有點像一個bug而不是一個特徵。
它有幫助。謝謝。 – yehnan 2012-02-25 12:10:38
這不是嚴格回答問題,但如果你只想要一個只包含所有文件的變量,那麼find
可能會更快,我認爲即使它創建了另一個進程並且不僅僅依賴於make功能。
FILES := $(shell find $(SOME_PATH) -type -f)
一個優點是,甚至可以使用多個路徑爲輸入(即SOME_PATH
)。
+1,非常好的黑客! – 2012-02-26 20:44:54
非常感謝。執行時間的差異很大。 – yehnan 2012-03-02 15:07:01