2010-01-15 16 views
8

मैं जैसे नामों के साथ फाइलों का एक समूह के साथ एक निर्देशिका है आगे लगे शून्य दूर करने के लिए:बैश आदेश सभी फ़ाइल नाम

0.jpg 
0.jpg 
004729342.jpg 

मैं सभी फ़ाइल नाम में से अग्रणी शून्य निकालना चाहते हैं, तो मैं होगा के साथ छोड़ दिया:

1234.jpg 
1235.jpg 
4729342.jpg 

मैं sed के विभिन्न विन्यास की कोशिश कर रहा है, लेकिन मैं उचित सिंटैक्स नहीं मिल रहा। निर्देशिका में सभी फाइलों को सूचीबद्ध करने का कोई आसान तरीका है, इसे sed के माध्यम से पाइप करें, या तो आगे बढ़ें या उन्हें प्रमुख शून्य के बिना नए फ़ाइल नाम पर कॉपी करें?

+0

नोट: इस और अधिक कठिन छँटाई कर देगा। –

+1

जीएनयू कोर्यूटिल्स के साथ, 'ls -v' स्वाभाविक रूप से संख्याओं को क्रमबद्ध करेगा (ग्लिब एक्सटेंशन' संस्करण (3)/strverscmp (3) ') का उपयोग कर। लेकिन हां, सामान्य रूप से, फ़ाइल नामों के संख्यात्मक भाग को अब तक लम्बाई तक बदलना सामान्य collation ऑर्डर बदलता है। – ephemient

उत्तर

7
for FILE in `ls`; do mv $FILE `echo $FILE | sed -e 's:^0*::'`; done 
+1

आपको इस तरह 'ls' का उपयोग करने की आवश्यकता नहीं है (और नहीं)। इसे इस तरह से करें: 'FILE के लिए * ' –

+1

यह एक बुरा उदाहरण है। पहले एलएस का उपयोग करके, और फिर कभी भी अपने चर को उद्धृत न करें – ghostdog74

+0

मुझे ls का उपयोग करने में कोई समस्या नहीं दिखाई दे रही है। आप इसे नीचे दिए गए खोज कमांड या किसी अन्य कमांड के लिए प्रतिस्थापित कर सकते हैं। चूंकि यह काम करता है, मैं वास्तव में नहीं देखता कि आपकी औपचारिकताएं स्टाइलिस्ट के अलावा अन्य हैं, जो कि जब एक पंक्ति शेल स्क्रिप्ट की बात आती है तो थोड़ा सा व्यर्थ लगता है। – cyborg

1

sed का उपयोग करके देखें, उदा .:

sed -e 's:^0*::' 

पूरा पाश:

for f in `ls`; do 
    mv $f $(echo $f | sed -e 's:^0*::') 
done 
+0

मैं इस कमांड में निर्देशिका सामग्री कैसे पास करूं? – George

+0

पोस्ट – eduffy

+0

पोस्ट किया गया यह शायद जॉर्ज की स्थिति के लिए काफी अच्छा है, लेकिन एक अलग वातावरण में कोई विशेष मामले को संभालने की इच्छा रख सकता है जहां फ़ाइल नाम सभी शून्य है। –

0

यह शायद नहीं सबसे खूबसूरत लेकिन काम करेंगे।

for i in 0* 
do 
mv "${i}" "`expr "${i}" : '0*\(.*\)'`" 
done 
+0

आपके स्वरूपण को काम की ज़रूरत है। पूरी लाइन को कोडित अनुभाग बनाने के लिए 'के लिए' से पहले 4 रिक्त स्थान का उपयोग करें। – bradlis7

0

मैं बिल्कुल पता एसईडी न लेकिन आप find का उपयोग करके एक सूची प्राप्त कर सकते हैं:

find -type f -name *.jpg

तो अन्य जवाब के साथ यह

find . -type f -name *.jpg | sed -e 's:^0*::'

कैसा लग सकता है लेकिन मुझे नहीं पता कि वह sed कमांड ऊपर है या नहीं।

7

sed अपने आप में इस बात के लिए गलत उपकरण है: आप के रूप में अच्छी तरह से कुछ शेल पटकथा लेखन का उपयोग करने की जरूरत है।

कुछ विचारों के लिए Rename multiple files with Linux पृष्ठ देखें।

rename 's/^0*//' *.jpg 
+0

मुझे वह आदेश पसंद है, लेकिन दुर्भाग्य से यह हर सिस्टम पर स्थापित नहीं है :( –

+0

"इसके लिए स्वयं ही इसके लिए गलत उपकरण है"? Http://xkcd.com/285/ – BryanH

+0

@ ब्रायन एच: ?? यह विकिपीडिया नहीं है , इसलिए मुझे आपके xkcd कार्टून के कारण का यकीन नहीं है। मुझे लगता है कि मैं ऐसा करने की कोशिश कर रहा था (मुझे लगता है - यह लगभग 18 महीने पहले था) था कि वह स्वयं फाइलों का नाम बदलने में सक्षम नहीं है - आपको आवश्यकता होगी इसके साथ जाने के लिए कुछ अतिरिक्त स्क्रिप्टिंग। –

0

यहाँ एक है कि sed की आवश्यकता नहीं है बताया गया है::

for x in *.jpg ; do let num="10#${x%%.jpg}"; mv $x ${num}.jpg ; done 

ध्यान दें यह केवल काम करता है फ़ाइल नाम सभी नंबरों हैं जब विचारों का सुझाव दिया में से एक rename पर्ल स्क्रिप्ट का उपयोग करने के लिए है। तुम भी खोल का उपयोग करते हुए अग्रणी शून्य को दूर कर सकते हैं:

for a in *.jpg ; do dest=${a/*(0)/} ; mv $a $dest ; done 
6

बैश, जो अपने डिफ़ॉल्ट लॉगिन खोल होने की संभावना है, कोई बाहरी आदेशों जरूरी हैं।

shopt -s extglob 
for i in 0*[^0]; do mv "$i" "${i##*(0)}"; done 
+0

यह स्वीकार्य उत्तर होना चाहिए – zero0cool

0

बैश में शेल आप कर सकते हैं:

shopt -s nullglob 
for file in 0*.jpg 
do 
    echo mv "$file" "${file##*0}" 
done 
संबंधित मुद्दे