निम्नलिखित आपके दृष्टिकोण का प्रत्यक्ष निर्धारण है:
find . -type f -name 'file*' -exec sh -c 'x="{}"; mv "$x" "${x}_renamed"' \;
हालाँकि, यह बहुत महंगा है यदि आपके पास बहुत सारी मेलिंग फाइलें हैं, क्योंकि आप mvप्रत्येक मैच के लिए एक ताजा शेल (जो निष्पादित करते हैं ) शुरू करते हैं। और अगर आपके पास किसी भी फ़ाइल नाम में अजीब अक्षर हैं, तो यह फट जाएगा। एक अधिक कुशल और सुरक्षित तरीका यह है:
find . -type f -name 'file*' -print0 | xargs --null -I{} mv {} {}_renamed
इसमें अजीब नाम वाली फाइलों के साथ काम करने का भी फायदा है। यदि findयह समर्थन करता है, तो इसे कम किया जा सकता है
find . -type f -name 'file*' -exec mv {} {}_renamed \;
xargsजब का उपयोग नहीं कर संस्करण उपयोगी है {}के रूप में,
find .... -print0 | xargs --null rm
यहां rmएक बार (या कई बार बहुत सारी फाइलों के साथ) कॉल किया जाता है, लेकिन हर फाइल के लिए नहीं।
मैं हटा दिया basenameआप में सवाल है, क्योंकि यह शायद गलत है: आप कदम होगा foo/bar/file8करने के लिए file8_renamed, नहीं foo/bar/file8_renamed।
संपादन (जैसा कि टिप्पणियों में सुझाया गया है):
findबिना जोड़ा छोटाxargs
- जोड़ा गया सुरक्षा स्टिकर
xबेकार है:find . -type f -name 'file*' -exec mv {} "{}_renamed" \;xargsसंस्करण में पहले उदाहरण की तरह ही दक्षता है /