फ़ाइलों पर फेरबदल, एक हाइफ़न के साथ फ़ाइल नाम की अनदेखी


0

पृष्ठभूमि

आरजीबी से ग्रेस्केल में छवियों को परिवर्तित करना। विभिन्न निर्देशिकाओं में कई फाइलें मौजूद हैं। उदाहरण के लिए:

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

बैश विस्तारित ग्लोबिंग पैटर्न के साथ:

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

1
चूंकि यह पैटर्न अकेले अन्य चीजों से अलग होगा png, इसलिए मैं इसके बजाय यह सुझाव देता हूं for i in @(stripe|outline|solid)/@(!(*-bw).png); do:।
NuTTyX 19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.