使用“for in”迭代文件,但 shell 中指定的文件除外

使用“for in”迭代文件,但 shell 中指定的文件除外

我在这里找到了一个帖子我怎样才能运行 mogrify,但要在文件名前加上前缀?这是关于调整一批图像的大小。

其中有一个for inshell 脚本。我该如何排除一些单个文件,同时迭代大多数其他文件。

for image in *.png; do convert "$image" -resize 29.5% "$(dirname $image)/th_$(basename $image)"; done

例如:

我的文件夹中有这些文件(没有任何通用名称,如相同的前缀):

example_1_some_suffix.png
some_prefix_example_2.png
example_3.png
example_4.png
example_a.png

我可以用来for images in *.png迭代全部,但如果我只想处理前四个文件而忽略第五个文件怎么办?

答案1

您可以打开 extglob 以便能够更详细地指定掩码

shopt -s extglob
for image in ?(a)+(b)*.png ; do ...

如果你只是想跳过给定的文件,你可以这样做

for image in *.png ; do
    [[ $image == file-to-skip.png ]] && continue
    ...

答案2

假设您有 bash 版本 4:

declare -A exceptions=(
    [example_1_some_suffix.png]=skip
    [some_prefix_example_2.png]=skip
    [example_3.png]=skip
    [example_4.png]=skip
    [example_a.png]=skip
)
for image in *.png; do 
    [[ "${exceptions["$image"]}" == skip ]] && continue 
    # ...

不使用关联数组:

exceptions=(
    example_1_some_suffix.png 
    some_prefix_example_2.png 
    example_3.png 
    example_4.png 
    example_a.png 
)
for image in *.png; do 
    [[ " ${exceptions[*]} " == *" $image "* ]] && continue 
    # ...

所有引号和空格均必填。

相关内容