文件掩码上的bash循环
在文件掩码上执行for循环的正确方法是什么 例如,如果掩码没有扩展到任何文件,则循环不应运行;否则,它应该运行在它扩展到的所有文件上 naive方法的问题是,如果*没有扩展到任何内容,那么整个循环将运行一次,就好像*部分是文件名的实际部分,而文件名实际上并不存在一样。一种方法是:文件掩码上的bash循环,bash,loops,for-loop,filenames,Bash,Loops,For Loop,Filenames,在文件掩码上执行for循环的正确方法是什么 例如,如果掩码没有扩展到任何文件,则循环不应运行;否则,它应该运行在它扩展到的所有文件上 naive方法的问题是,如果*没有扩展到任何内容,那么整个循环将运行一次,就好像*部分是文件名的实际部分,而文件名实际上并不存在一样。一种方法是: for f in abc*; do if [[ -f "$f" ]]; then # Do something with "$f" fi; done 这也将从列表中筛选出目录,这可能是您想要的,也可能不是您想要的
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
这将在for循环的持续时间内设置nullglob。您可以在循环内取消设置它,而不必等待结束,在每个循环上执行shopt-u的成本很小。一种方法是:
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
这将在for循环的持续时间内设置nullglob。您可以在循环内取消设置它,而不必等待结束,只需在每个循环上执行shopt-u即可。使用nullglob shell选项将不匹配的通配符展开为零,而不是返回通配符本身:
shopt -s nullglob
for file in abc*
do
...
done
使用nullglob shell选项使不匹配任何内容的通配符展开为零,而不是返回通配符本身:
shopt -s nullglob
for file in abc*
do
...
done
文件掩码?你是说一个通配符模式吗?@codeforester一个老问题不应该是一个新问题的重复。@cnst这不是一个一般规则,请看@cnst:我选择了答案最好的,而不是基于时间的。问题的年龄应该无关紧要。文件掩码?你是说一个通配符模式吗?@codeforester一个老问题不应该是一个新问题的重复。@cnst这不是一个一般规则,请看@cnst:我选择了答案最好的,而不是基于时间的。问题的年龄不重要。我认为-f也会过滤掉symlinks@cnst:TIAS太短,不能作为注释。但是,无论如何,指向文件的符号链接是-fi think-f也会过滤掉的symlinks@cnst:TIAS太短,不能作为注释。但是,无论如何,指向文件的符号链接是-f