xargs का उपयोग तर्क को पाइप के साथ उप शेल में पास करते हैं


0

मैं कई फाइलों का नाम बदलना चाहता हूं। मुझे लगता है कि मैं इसे करने के लिए xargs का उपयोग कर सकता हूं।

find ./ -name "upload.log-*" 
./upload.log-20180622.gz-20180624.gz-20180626.gz
./upload.log-20180624.gz-20180626.gz
./upload.log-20180620.gz-20180622.gz-20180624.gz-20180626.gz
./upload.log-20180621.gz-20180623.gz-20180625.gz-20180627.gz

find ./ -name "upload.log-*" -print | cut -d"-" -f-2
./upload.log-20180622.gz
./upload.log-20180624.gz
./upload.log-20180620.gz
./upload.log-20180621.gz

मैं निम्नलिखित कोशिश कर रहा हूं, लेकिन यह काम नहीं कर रहा है

find ./ -name "upload.log-*" | xargs -I '{}' sh -c "echo $1 $(echo $1 | cut -d"-" -f-2)" "{}"

जवाबों:


0

यह वही करता है जो मुझे करने की आवश्यकता है

find ./ -name "cleanup.log-*" | xargs -I '{}' sh -c 'mv "$1" $(echo {} | cut -d"-" -f-2)' - {}

मुश्किल बिट xargs प्रतिस्थापन परिवर्तित कर रहा था -I {} xargs कमांड के लिए तर्कों में स्ट्रिंग sh -c ...
मैंने एक विकल्प विकल्प नहीं डालकर ऐसा किया -प्रतिस्थापन स्ट्रिंग से पहले कमांड के अंत में {}

इस प्रकार xargs के लिए मेरा आदेश निम्नलिखित है।
sh -c 'mv "$1" $(echo {} | cut -d"-" -f-2)' - {}

मैंने इसका उपयोग इस बात के परीक्षण के लिए किया कि मैं चाल कमांड चलाने से पहले क्या चाहता था

find ./ -name "upload.log-*" | xargs -I '{}' sh -c 'echo "$1" $(echo {} | cut -d"-" -f-2)' - {}

मैंने इस साइट को यह समझने में मददगार पाया कि इस समस्या को कैसे हल किया जाए

https://explainshell.com

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.