2014-09-25 43 views
0

對文件掩碼執行循環的正確方法是什麼?bash循環覆蓋文件掩碼

E.g.如果掩碼沒有展開到任何文件,則循環不應該運行;否則,它應該運行它擴展到的所有文件。

與幼稚的做法的問題是,如果*不會擴展到任何東西,那麼整個循環將彷彿*部分是文件名的實際部分(實際上不存在的文件運行一次)。要做到這一點

+0

_file MASK_?你的意思是通配符模式嗎? – Barmar 2014-09-25 06:14:44

回答

2

一種方法是:

for f in abc*; do if [[ -f "$f" ]]; then 
    # Do something with "$f" 
fi; done 

這也將篩選出的目錄列表中,這可能會或可能不是你想要的是。

如果要保留目錄,請使用-e而不是-f

另一種方法是設置shell選項nullglob(可能不適用於所有bash版本)。使用nullglob集合時,與任何文件名不匹配的模式都不會產生任何改變。

shopt -s nullglob 
for f in abc*; do 
    # do something with $f 
done 
shopt -u nullglob 

(這使得nullglob設置爲for循環的持續時間,你可以取消它的循環,而不是等待結束,在每個循環執行shopt -u的短小的成本里面。)

+0

我認爲-f也會過濾掉符號鏈接 – cnst 2014-09-25 06:24:25

+0

@cnst:TIAS太短而無法評論。但是,無論如何,符號鏈接到文件是'-f' – rici 2014-09-25 06:28:50

0

使用nullglob外殼選項,以使通配符不匹配任何擴展到什麼,而不是返回通配符本身:

shopt -s nullglob 
for file in abc* 
do 
    ... 
done