2012-02-25 147 views

回答

8

約翰馬歇爾有一種方法可行,但有一種更安全的方法。所有的目錄總是有一個衆所周知的條目,那就是「。」。所以,你需要做的是:

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

通配符將匹配所有目錄,並且只匹配目錄,因爲只有目錄包含「。」。這是健壯的。

Yehnan的方法也可以工作,但效率較低,因爲您正在爲PATHS中的每個元素調用一個shell。這很可能不會對整個運行時間產生很大的影響,但如果可以在內部完成而不是通過運行shell,我寧願這樣做。它還有助於避免$(shell ...)的可移植性。

+2

+1,非常好的黑客! – 2012-02-26 20:44:54

+1

非常感謝。執行時間的差異很大。 – yehnan 2012-03-02 15:07:01

0

代碼工作在一個標準的bash並打印找到的元素,如果它是一個目錄:

PATHS=$(wildcard *) 
for f in $(PATHS); do \ 
    if test -d $$f; then echo "$$f: DIR"; fi; \ 
done 
1
PATHS = $(wildcard $(SOME_PATH)/*) 
DIRPATHS = $(foreach dir, $(wildcard $(PATHS)/*), $(shell test -d $(dir) && echo $(dir))) 
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)) 

但我不太確信取決於的穩健性來生成文件的條目,因爲它們實際上並不匹配所請求的模式(即,這樣的條目沒有結尾的斜線)。

GNU Make 3.82確實產生了這樣的條目,但它看起來有點像一個bug而不是一個特徵。

+0

它有幫助。謝謝。 – yehnan 2012-02-25 12:10:38

0

這不是嚴格回答問題,但如果你只想要一個只包含所有文件的變量,那麼find可能會更快,我認爲即使它創建了另一個進程並且不僅僅依賴於make功能。

FILES := $(shell find $(SOME_PATH) -type -f) 

一個優點是,甚至可以使用多個路徑爲輸入(即SOME_PATH)。

相關問題