पुनरावर्ती फ़ाइल एक्सटेंशन को सभी फ़ाइलों में जोड़ें


106

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

जवाबों:


228

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

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

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


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

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

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

2
इस कमांड में एक्सटेंशन के साथ फाइल भी मिलेगी। क्या यही ओपी चाहता है?
११:

1
@ ghostdog74: जब से उन्होंने इस जवाब को स्वीकार किया है, उपरोक्त ने स्पष्ट रूप से चाल चली। अन्यथा, जैसा कि आपने नीचे उल्लेख किया है, जोड़ना -not -name "*.*"चाल करेगा।
Stephan202

62

यह एक्सटेंशन के बिना फ़ाइलें ढूंढेगा और अपना .jpg जोड़ देगा

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

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

9

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

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

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

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


4

इस तरह,

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

मुझे उम्मीद नहीं है कि आपके पास अलग-अलग फ़ाइल नाम हैं,
यदि आप करते हैं, तो नामों को थोड़ा संसाधित करने की आवश्यकता होगी।

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


1
यह एक 'डू' याद कर रहा है और यदि फ़ाइल नाम में रिक्त स्थान हैं, तो फ़ाइल नाम को उद्धृत करना बेहतर हो सकता है: $ f में (ढूँढें। -Type f); mv "$ f" "$ {f} .jpg"; किया
DrAl

और शायद मैं शीर्ष स्तर निर्देशिका के भीतर से चला जाएगा?
लूटता है

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

मुझे कहीं जाना था और बहुत तेजी से टाइप करना ... अब ठीक करना।
निक

1

विंडोज बेसिक में बिना एक्सटेंशन वाली सभी फाइलों का नाम बदलने के लिए, आप फाइल को बिना एक्सटेंशन के कर सकते हैं ren * *.jpg , बस * का उपयोग करें, या यदि आप png को jpg उपयोग में बदलना चाहते हैंren *.png *.jpg


0

rename

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


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

मुझे पता है कि कम से कम दो अलग-अलग कमांडों को बुलाया जाता है rename, हमारे विश्वविद्यालय के डेबियन मशीनों पर उपयोग-लिनेक्स-एनजी और एक पर्ल प्रोग्राम (वॉल स्वयं द्वारा) में शामिल एक सी प्रोग्राम। दरअसल, दोनों में से कोई भी रिक्रिएशन नहीं करता है।
बोल्ड्यूइन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.