पृष्ठभूमि
आरजीबी से ग्रेस्केल में छवियों को परिवर्तित करना। विभिन्न निर्देशिकाओं में कई फाइलें मौजूद हैं। उदाहरण के लिए:
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कुंठित लगता है।) यह एक शैक्षिक सवाल यह है कि, के रूप में समाधान काम करता है।
png, इसलिए मैं इसके बजाय यह सुझाव देता हूंfor i in @(stripe|outline|solid)/@(!(*-bw).png); do:।