/ फ़ाइल नाम के अंदर / प्रारूप को शेल कमांड - बैश, शेल

शेल कमांड फ़ाइल नामों के अंदर संख्याओं को प्रारूपित करने के लिए - बैश, खोल

मेरे पास निम्न फ़ाइलों वाला एक फ़ोल्डर है:

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