bash loop over file mask

假装没事ソ 提交于 2019-12-13 07:14:36

问题


What's the proper way to do a for loop over a file mask?

E.g. if the mask doesn't expand to any file, then the loop should not run; else, it should run over all the files that it expands to.

The problem with naive approach is that if the * doesn't expand to anything, then the whole loop will run once as if the * part is an actual part of a filename (of a file that doesn't actually exist).


回答1:


One way to do this is:

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

That will also filter directories out of the list, which might or might not be what you want.

If you want to keep directories, use -e instead of -f.

Another way to do it is to set the shell option nullglob (may not be available on all bash versions). With nullglob set, patterns which don't match any filename will result in nothing instead of being unaltered.

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

(That leaves nullglob set for the duration of the for loop. You can unset it inside the loop instead of waiting for the end, at the smallish cost of executing the shopt -u on every loop.)




回答2:


Use the nullglob shell option to make a wildcard that doesn't match anything expand into nothing instead of returning the wildcard itself:

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


来源:https://stackoverflow.com/questions/26031736/bash-loop-over-file-mask

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!