在for循环中排除具有特定前缀的文件名(globbing)

时间:2014-02-04 21:27:11

标签: linux bash

这可能很容易,但我无法弄清楚。在for循环中,我想要排除前缀为zz的某些文件(例如zz131232.JPG),但我不知道如何排除这些文件。

for i in *.JPG; do
    # do something
done

如何修改“for rule”以排除前缀为zz的文件?

2 个答案:

答案 0 :(得分:3)

这样的东西
for i in *.JPG; do
  [[ $i != "zz"* ]] && echo "$i"
done

或跳过它们:

for i in *.JPG; do
  [[ $i == "zz"* ]] && continue
  # process the other files here
done

答案 1 :(得分:1)

如果您要处理许多文件,也可以使用GLOBIGNOREextended globbing来避免首先扩展您想要跳过的文件(可能更快):

GLOBIGNORE='zz*'
for file in *.JPG; do
    do_something_with "${file}"
done
# save and restore GLOBIGNORE if necessary

shopt -s extglob # enable extended globbing
for file in !(zz*).JPG; do
    do_something_with "${file}"
done
shopt -u extglob # disable extended globbing, if necessary

请注意,如果当前目录中没有.JPG个文件,则仍会输入循环并将$i设置为文字*.JPG(在您的示例中),因此您要么需要检查循环内是否存在文件或使用nullglob选项。

for file in *.JPG; do
    [ -e "${file}" ] || continue
    do_something_with "${file}"
done

shopt -s nullglob
for file *.JPG; do
    do_something_with "${file}"
done
shopt -u nullglob # if necessary

在shell中尝试以下操作,以了解在没有nullglob的情况下会发生什么:

$ for f in *.doesnotexist; do echo "$f"; done
*.doesnotexist