这可能很容易,但我无法弄清楚。在for循环中,我想要排除前缀为zz
的某些文件(例如zz131232.JPG
),但我不知道如何排除这些文件。
for i in *.JPG; do
# do something
done
如何修改“for rule”以排除前缀为zz
的文件?
答案 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)
如果您要处理许多文件,也可以使用GLOBIGNORE
或extended 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