क्यों नहीं करता
find . -type f -exec echo $(file={}; echo ${file:0:5}) \;
फ़ाइल के पहले पाँच अक्षर दें, जबकि यह काम करता है:
find . -type f -exec bash -c 'echo ${1:0:5}' funcname {} \;
पृष्ठभूमि :
मैं छवियों से भरे एक पेड़ को थंबनेल में बदलने के लिए बैच करने की कोशिश कर रहा हूं, और मैं फ़ाइल नाम के अंत में, लेकिन विस्तार से पहले '_thumb' जोड़कर मक्खी पर उनका नाम बदलना चाहता हूं। यह नाम बदलने की प्रक्रिया एक फ़ाइल के लिए आसान है:
file='I am a picture.jpg'
mv \"$file\" \"${file%\.*}_thumb.${file##*\.}\"
(दूसरी लाइन का विस्तार mv "I am a picture.jpg" "I am a picture_thumb.jpg"
)
लेकिन जब मैं इस कमांड को इनकैप्सुलेट करने की कोशिश करता हूं -exec
का पैरामीटर find(1)
मैं द्वारा दिए गए फ़ाइल नाम में हेरफेर नहीं कर सकता find
(उदाहरण सरलीकृत):
find . -type f -exec ${{}:0:5}) \;
देता है
bash: ${{}:0:5}: bad substitution
एक उप-प्रकार का उपयोग करके मुझे थोड़ा और आगे मिलता है:
find . -type f -exec echo $(file={}; echo ${file:0:5}) \;
यह फ़ाइल नाम को प्रतिध्वनित करता है, लेकिन किसी कारण से स्ट्रिंग हेरफेर को निष्पादित नहीं करता है।
मैं अंत में समाधान मिल गया यह एसओ पद :
find . -type f -exec bash -c 'echo ${1:0:5}' funcname {} \;
लेकिन मुझे समझ नहीं आ रहा है कि जब यह काम करेगा $(...)
निर्माण नहीं करता है।
${file:0:5}
रिटर्न{}
अगर$file={}
। जब मैं उपयोग करता हूं$(file={}; echo ${file:0:1})
यह वास्तव में केवल आउटपुट करता है{
।