2009-07-10 10 views
80

मेरे पास कुछ निर्देशिकाएं और उप-निर्देशिकाएं हैं जिनमें फ़ाइल एक्सटेंशन नहीं है। मैं इन निर्देशिकाओं में निहित सभी फ़ाइलों को .jpg जोड़ना चाहता हूं। मैंने फ़ाइल एक्सटेंशन को बदलने के लिए बैश स्क्रिप्ट देखी हैं लेकिन केवल एक जोड़ने के लिए नहीं। इसे रिकर्सिव करने की भी आवश्यकता है, क्या कोई मदद कर सकता है?सभी फ़ाइलों में फ़ाइल एक्सटेंशन को दोबारा जोड़ें

उत्तर

176

एक स्पष्ट पाश बिना वैकल्पिक आदेश (man find):

find . -type f -exec mv '{}' '{}'.jpg \; 

स्पष्टीकरण: इस रिकर्सिवली सभी फाइलों को पाता है (-type f) वर्तमान निर्देशिका (.) से शुरू और से प्रत्येक के लिए कदम आदेश (mv) लागू होता है उन्हें। {} के आसपास उद्धरण भी नोट करें, ताकि रिक्त स्थान (और यहां तक ​​कि न्यूलाइन ...) के साथ फ़ाइल नाम ठीक तरह से संभाले जा सकें।

+6

विशेष रूप से, यह एक बेहतर काम करता है यदि निर्देशिका संरचना में बड़ी संख्या में फाइलें हैं (जिससे बैश को फ़ाइलों की सूची की लंबाई के बारे में परेशान होने का कारण बनता है)। – DrAl

+0

@ एएल, यदि आप फाइलों की सूची में पुनरावृत्ति करने के लिए 'for' लूप अपसेटिंग बैश का संदर्भ लेते हैं, तो यह सही नहीं है। 'लूप' के लिए बैश प्रत्येक 'mv' कमांड को सक्रिय रूप से जारी करता है। – nik

+0

प्रश्न: क्या 'ढूंढें 'पहले फाइलों की सूची सेट अप करता है * इससे पहले * यह' -exec' कथन निष्पादित करता है? मुझे ऐसा लगता है, लेकिन असीमित loops कोडिंग से पहले इस बिंदु को स्पष्ट करना चाहते हैं। – Boldewyn

4

इस तरह,

for f in $(find . -type f); do mv $f ${f}.jpg; done 

मैं उम्मीद नहीं कर रहा हूँ आप अंतरिक्ष अलग फ़ाइल नाम है,
आप करते हैं, नाम एक सा कार्य किया जाना आवश्यक होगा।

आप कुछ अन्य निर्देशिका से आदेश पर अमल करना चाहते हैं,
आप find /target/directory साथ find . बदल सकते हैं।

+1

यह एक याद आ रही है jpg को आप png बदलना चाहते हैं के लिए 'करें' और यदि फ़ाइल नाम में रिक्त स्थान हैं, तो फ़ाइल नाम को उद्धृत करना बेहतर हो सकता है: $ में f के लिए (ढूंढें। -type f); एमवी "$ एफ" "$ {एफ} .jpg" करें; – DrAl

+0

किया और संभवतः मैं इसे शीर्ष स्तर की निर्देशिका में से चलाऊंगा? – robjmills

+0

@seengee: हाँ। ध्यान दें कि यह आदेश '-type' में डैश को भी याद करता है। – Stephan202

49

इस विस्तार के बिना फ़ाइलों को खोजने के लिए और जोड़ देगा अपने

find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \; 
+6

+1 क्योंकि यह उन फ़ाइलों को छोड़ देता है जिनके पास पहले से ही एक एक्सटेंशन है। – Stephan202

+0

यह निश्चित रूप से वांछित परिणाम 99% समय प्रदान करेगा। +1 – les

0

rename

यकीन है कि यह एक्सटेंशन के बिना फ़ाइलों का नाम कर सकते हैं (मैं विंडोज 7 पर अभी हूँ)

+1

यह कर सकता है, लेकिन यह निर्देशिकाओं का नाम भी बदल देगा, और उप-निर्देशिकाओं में कम से कम काम करने के लिए इसे बताने का कोई तरीका नहीं है (कम से कम मेरे पास उबंटू पर संस्करण के साथ)। – mirod

+0

मुझे कम से कम दो अलग-अलग आदेशों को पता है जिन्हें 'नाम बदलें' कहा जाता है, एक सी प्रोग्राम जो कि यूनिवर्सिटी-लिनक्स-एनजी में शामिल है और हमारे विश्वविद्यालय की डेबियन मशीनों पर एक पर्ल प्रोग्राम (वॉल वॉल द्वारा) शामिल है। असल में, दोनों में से कोई भी रिकर्सन नहीं करता है। – Boldewyn

9

नहीं .jpg यह थोड़ा देर हो चुकी है, लेकिन मैंने सोचा कि मैं अब तक बेहतर समाधान (हालांकि शायद कम पठनीय) जोड़ सकता हूं:

find /path -type f -not -name "*.*" -print0 | xargs -0 rename 's/(.)$/$1.jpg/' 

find | xargs पैटर्न का उपयोग आमतौर पर अधिक कुशल निष्पादन में होता है, क्योंकि आपको प्रत्येक फ़ाइल के लिए एक नई प्रक्रिया को फोर्क नहीं करना पड़ता है।

ध्यान दें कि पारंपरिक नाम के बजाय डेबियन-स्वाद वाले डिस्ट्रोज़ (उर्फ उन्माद) में पाए गए नाम के संस्करण की आवश्यकता है। यह सिर्फ एक छोटी सी पर्ची लिपि है, इसलिए, किसी भी सिस्टम पर उपरोक्त आदेश का उपयोग करना इतना आसान होगा।

0

विंडोज बुनियादी में कोई विस्तार के साथ सभी फ़ाइलों का नाम बदलने आप ren * *.jpg कर सकते हैं कोई विस्तार के रूप में फ़ाइल के बाद से, बस * उपयोग करें, या उपयोग ren *.png *.jpg

संबंधित मुद्दे