这个问题可能很简单,但我想不出来。在一个for循环中,我想要排除以前缀zz
开头的文件(例如zz131232.JPG
),但我不知道如何排除这些文件。
for i in *.JPG; do
# do something
done
如何修改“for规则”以排除以前缀zz
开头的文件?
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
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