2014-09-25 64 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