背景
将图像从 RGB 转换为灰度。不同目录中存在许多文件。例如:
outline/trigon.png
outline/oval-bw.png
outline/crescent-bw.png
outline/trigon-bw.png
outline/crescent.png
outline/oval.png
问题
遍历一组文件(不带连字符)并将它们转换为灰度,不包括已转换的文件。已转换的文件的文件名以 结尾-bw.png
。脚本应避免创建-bw-bw.png
文件。
解决方案
以下行将仅迭代尚未转换的文件:
for i in $(find ./stripe/ ./outline ./solid -name "*.png" -exec echo {} \; | grep -v "-"); do
完整脚本:
#!/bin/bash
# Avoid converting existing B&W files...
for i in $(find ./stripe/ ./outline ./solid -name "*.png" -exec echo {} \; | grep -v "-"); do
SHAPEDIR=$(dirname $i)
SHAPENAME=$(basename $i .png)
OUTPUTSHAPE=$SHAPEDIR/$SHAPENAME-bw.png
echo "convert $i to $OUTPUTSHAPE ..."
convert $i -density 600 -colorspace gray $OUTPUTSHAPE
done
问题
有什么更简单的方法可以迭代所有文件,同时忽略-bw
名称中带有连字符(例如)的文件?(使用find
和echo
和grep
似乎很难理解。)这是一个学术问题,因为解决方案有效。
答案1
使用 bash 扩展的通配符模式:
$ shopt -s extglob
$ echo outline/!(*-*)
outline/crescent.png outline/oval.png outline/trigon.png