bash - Exec के माध्यम से खोज के आउटपुट पर बैश चर प्रतिस्थापन



find substitution (1)

क्या find के आउटपुट पर bash चर प्रतिस्थापन लागू करने का कोई तरीका है? मुझे पता है मैंने देखा है कि किसी ने स्टैक ओवरफ्लो पर ऐसा किया है लेकिन मुझे लगता है कि अब उस विशेष पोस्ट को ढूंढने में प्रतीत नहीं हो सकता।

उदाहरण के तौर पर , *_copy.png कि मैं *.png से *_copy.png फाइल का नाम बदलना चाहता *_copy.png । मुझे पता है कि मैं यह rename कर सकता हूं लेकिन यह सिर्फ एक सोचा प्रयोग है।

अब मैं ऐसा कुछ करने में सक्षम होना चाहता हूं:

find . -name "*png" -exec mv "{}" "${{}%.*}_copy.png" \;

कौन सा परिणाम अमान्य प्रतिस्थापन में होता है बेशक, मैं पहले आउटपुट को एक चर में निर्दिष्ट कर सकता था और फिर एक सब-शेल में प्रतिस्थापन लागू कर सकता था, लेकिन यह वास्तव में एकमात्र तरीका है?

find . -name "*.png" -exec bash -c 'var="{}";  mv "{}" "${var%.*}_copy.png"' \;

या ऐसा कोई तरीका है जिसे सीधे {} से प्राप्त किया जा सकता है?

आम सहमति

जैसा कि इटान रीज़नर ने टिप्पणी करते हुए, खोज के उत्पादन को संभालने का एक बेहतर और सुरक्षित तरीका यह तर्कसंगत तर्क के रूप में होगा।

find . -name "*.png" -exec bash -c 'mv "$0" "${0%.*}_copy.png"' "{}" \;

प्रश्न पाने के लिए मुझे कुछ समय लगा। असल में आप पूछ रहे हैं कि जैसे कुछ:

echo "${test.png%.png}"

शब्द test प्राप्त करने के लिए इस्तेमाल किया जा सकता है

जवाब न है। स्ट्रिंग हेरिपूल ऑपरेटर ${ प्रारंभ होने वाले पैरामीटर प्रतिस्थापन ऑपरेटर का एक सबसेट है वे केवल वेरिएबल्स पर कार्य करते हैं, स्ट्रिंग लीटरल्स के साथ नहीं, जिसका अर्थ है कि आपको पहले स्ट्रिंग को एक वैरिएबल में स्टोर करना होगा। इस कदर:

img="test.png"
echo "${img%.png}"

बस Google के यात्रियों के लिए, मैं इस विशेष कार्य के लिए rename उपयोग करेगा। (ओपी पहले से ही अपने प्रश्न में उल्लेख किया है)। कमांड इस तरह दिख सकती है:

find -name '*png' -execdir rename 's/\.png/_copy.png/' {} +




built-in