Фон

Преобразование изображений из 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 ответ1

1

С расширенными шаблонами глобализации bash:

$ shopt -s extglob
$ echo outline/!(*-*)
outline/crescent.png outline/oval.png outline/trigon.png

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .