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

5

这个问题可能很简单,但我想不出来。在一个for循环中,我想要排除以前缀zz开头的文件(例如zz131232.JPG),但我不知道如何排除这些文件。

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

如何修改“for规则”以排除以前缀zz开头的文件?

2个回答

4

Something like

for i in *.JPG; do
  [[ $i != "zz"* ]] && echo "$i"
done

或者跳过它们:
for i in *.JPG; do
  [[ $i == "zz"* ]] && continue
  # process the other files here
done

完美运行!非常感谢! - Helfenstein

1
如果你要处理许多文件,你也可以使用GLOBIGNORE扩展的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

在不使用nullglob的情况下,请尝试在您的shell中执行以下操作,以了解发生了什么:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接