(1) के लिए -exec पैरामीटर में सब्सक्रिप्शन तर्क


7

क्यों नहीं करता

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 {} \;

लेकिन मुझे समझ नहीं आ रहा है कि जब यह काम करेगा $(...) निर्माण नहीं करता है।

जवाबों:


6

exec यह क्या कहता है: का उपयोग करता है exec()। इसमें एक शेल शामिल नहीं होता है जब तक कि इसमें बताया न जाए: -exec bash ... ), और अगर यह तुमने किया होता फिर भी परिवर्तनशील प्रक्षेपों की व्याख्या करने से अपने संवादात्मक खोल को रखने के लिए एकल उद्धरणों की आवश्यकता है। (शेल जादू नहीं है और यह नहीं जानता है कि आपने उन लोगों को किसी और चीज़ से प्रक्षेपित करने का इरादा किया है।)


उदाहरण के लिए, जब आप निम्न कमांड का उपयोग करते हैं:

find . -type f -exec echo  $ (फ़ाइल = {}; प्रतिध्वनि $ {फ़ाइल: 0: 5})  \; 

आपका खोल प्रथम निष्पादित करके प्रक्रिया प्रतिस्थापन करता है $(file={}; echo ${file:0:5}), जो बस आउटपुट देता है {}, फिर अंतिम आदेश निष्पादित करता है:

find . -type f -exec echo  {}  \; 

आह, मैं अब देखता हूं। बेशक ${file:0:5} रिटर्न {} अगर $file={}। जब मैं उपयोग करता हूं $(file={}; echo ${file:0:1}) यह वास्तव में केवल आउटपुट करता है {
Tim
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.