मेरे पास निम्न फ़ाइलों वाला एक फ़ोल्डर है:
trackingData-00-1.data, trackingData-00-2.data, ..., trackingData-00-2345.data
और मैं 4 अंकों के साथ संख्याओं को प्रारूपित करके उनका नाम बदलना चाहूंगा
trackingData-00-0001.data, trackingData-00-0002.data, ..., trackingData-00-2345.data
मैं एक बैश शेल कमांड के साथ कैसे प्राप्त कर सकता हूं?
उत्तर:
उत्तर № 1 के लिए 6शुद्ध bash
उपाय:
for f in trackingData-00-*.data; do
[[ $f =~ trackingData-00-([0-9]+).data ]]
mv "$f" $(printf "trackingData-00-%04d.data" ${BASH_REMATCH[1]})
done
एक नियमित अभिव्यक्ति पैड में संख्या को निकालती है और इसे स्टोर करती है BASH_REMATCH
सरणी। फिर printf
नए फ़ाइल नाम को बनाने के लिए उपयोग किया जाता है, संख्या को फिर से लगाया और शून्य के साथ गद्देदार किया जाता है।
जवाब के लिए 2 № 2
गंदा लेकिन काम हैक:
for i in $(seq 2345); do
mv trackingData-00-$i.data trackingData-00-`printf %04d $i`.data;
done
जवाब के लिए 2 № 3
आप उपयोग कर सकते हैं printf
चार अंकों के प्रिंट के लिए awk में विकल्प:
echo 3 | awk "{printf ("%04i", $1)}"
0003
echo 33 | awk "{printf ("%04i", $1)}"
0033
तो यह हो सकता है:
for file in trackingData*
do
num=$(awk -F[.-] "{printf ("%04i", $3)}" <<< "$file")
mv $file trackingData-00-$num.data
done
यह उपयोग करता है awk
दोनों क्षेत्र विभाजक के साथ: या तो .
या -
। फिर, यह उन पर आधारित 3 ब्लॉक लेता है और के साथ इसके मूल्य को प्रारूपित करता है %04i
झंडा (लगभग बराबर) %d
जैसा इसमें दिखे GNU Awk उपयोगकर्ता की मार्गदर्शिका # 5.5.2 प्रारूप-नियंत्रण पत्र)।
उत्तर के लिए 1 № 4
सबसे पहले, मैं मानता हूं कि आपके फ़ाइल नाम में कोई स्थान नहीं है। फिर
ls/find...| awk -F"-|\." "{o=$0;$3=sprintf("%04d",$3);$4=".data";gsub(/-./,".");print "mv "o" "$0}" OFS="-"
प्रिंट करेगा mv ...
आदेश। उन्हें निष्पादित करने के लिए, बस आउटपुट को पाइप करें sh
पसंद
ls...|awk ..|sh
कोर awk हिस्सा है, इसे थोड़ा परीक्षण करें:
kent$ echo "trackingData-00-1.data
trackingData-00-2.data"|awk -F"-|\." "{o=$0;$3=sprintf("%04d",$3);$4=".data";gsub(/-./,".");print "mv "o" "$0}" OFS="-"
mv trackingData-00-1.data trackingData-00-0001.data
mv trackingData-00-2.data trackingData-00-0002.data