2015-06-06 6 views
5

तो मेरे पास हजारों छवि फ़ाइलों वाले फ़ोल्डर हैं, वे सभी .jpg के रूप में सहेजे गए हैं।".jpg" एक्सटेंशन के साथ ".jpg" एक्सटेंशन के साथ पीएनजी छवियों का एक समूह का नाम बदलें।

समस्या यह है कि उनमें से कुछ फ़ाइलें वास्तव में पीएनजी छवि फाइलें हैं, इसलिए वे कई प्रोग्रामों में नहीं खुलते हैं, जब तक कि मैं मैन्युअल रूप से .png पर अपना एक्सटेंशन नहीं बदलता। उदाहरण के लिए, उबंटू छवि दर्शक इस त्रुटि फेंकता है:

"Error interpreting JPEG image file (Not a JPEG file: starts with 0x89 0x50)"

मैं पहले से ही इस त्रुटि पुष्टि करने के लिए इनमें से कुछ फ़ाइलों का एक hexdump भाग गया है और यह बाहर की जाँच करता है।

मैं अन्य फ़ाइलों के बीच गलत एक्सटेंशन के साथ सभी फ़ाइलों को खोजने और उनके एक्सटेंशन को बदलने के लिए एक आसान तरीका ढूंढ रहा हूं। उदाहरण के लिए मैं इसे बैश स्क्रिप्ट के साथ कैसे करूं? अब तक मुझे कोई जानकारी नहीं है। सभी मदद की सराहना की!

उत्तर

6
for f in *.jpg ; do 
    if [[ $(file -b --mime-type "$f") = image/png ]] ; then 
    mv "$f" "${f/%.jpg/.png}" 
    fi 
done 

यह .jpg फ़ाइलों की एक सूची हो जाता है, तो प्रत्येक के लिए माइम प्रकार प्राप्त करने के लिए उस पर file उपयोगिता कहता है। यदि यह image/png है, तो यह string manipulation प्रतिस्थापन का उपयोग कर फ़ाइल का नाम बदलता है।

0

मुझे बैश स्क्रिप्ट के लिए उचित आदेशों के बारे में निश्चित नहीं है लेकिन आप इन फ़ाइलों को खोलने और त्रुटि को पकड़ने के लिए आसानी से एक C++ फ़ाइल लिख सकते हैं। आपके द्वारा त्रुटि को पकड़ने वाली फ़ाइलें उचित प्रकार नहीं होंगी (मान लीजिए कि यह आपका एकमात्र मुद्दा है)। यदि आप जानते हैं कि उन गलत फ़ाइल प्रकारों को पीएनजी होना चाहिए, तो आप फ़ाइल का नाम बदल सकते हैं। स्यूडोकोड की तरह कुछ:

For (ALL_FILES) 
{ 
    try 
    { 
    open(FILENAME); 
    } 
    catch 
    { 
    rename(FILENAME, NEW_FILENAME); 
    } 
} 
+1

यह * डेटा डेटा * * के लिए 'ओपन' प्रयासों को मानता है * और * यह फ़ाइल एक्सटेंशन पर सही होने पर निर्भर करता है। एक साधारण 'सामान्य' 'खुला' हमेशा एक मौजूदा फाइल पर सफल होगा। एक 'स्मार्ट' 'ओपन' फ़ाइल एक्सटेंशन को अनदेखा कर देगा और इसके प्रकार का निर्धारण करने के लिए फ़ाइल के [जादू हस्ताक्षर] (http://en.wikipedia.org/wiki/List_of_file_signatures) का उपयोग करेगा और इसलिए सफल हो सकता है। – usr2564301

1

आप file का उपयोग करें और उत्पादन को पार्स करना चाहते हैं। आप देख सकते हैं कि यह एक JPEG या उत्पादन के प्रारंभिक भाग की जाँच करके एक PNG है:

F="filename.jpg" 
TYPE=$(file -b $F) 
[[ $TYPE == JPEG\ image\ data* ]] && echo "jpg" 
[[ $TYPE == PNG\ image\ data* ]] && echo "png" 

आप basename साथ .jpg अलग करना द्वारा विस्तार बदल सकते हैं। उदाहरण के लिए, निम्नलिखित .png को विस्तार .jpg साथ फ़ाइल $F के विस्तार बदल जाएगा:

mv $F $(dirname $F)/$(basename $F .jpg).png 
1

सबसे पहले फ़ाइलों की एक सूची है और उन्हें एक फ़ाइल में बनाते हैं। फिर सूची को एक लूप पर संसाधित करें ताकि आप फ़ाइलों को स्वचालित रूप से एक-एक करके बदल सकें।

#!/bin/bash 

FILE=/tmp/list ## Assuming the list of files are in this file. 
for file in $(cat $FILE); do 
    OLD_FILE=$file 
    NEW_FILE=$(echo $file|sed -e 's/jpg$/png/') 
    mv $OLD_FILE $NEW_FILE 
done 
1

सभी फ़ाइलों के प्रकार को निर्धारित करने के लिए file (1) का उपयोग करें। इस सूची को फ़िल्टर करने के लिए grep (1) का उपयोग करें, सभी उचित जेपीईजी फ़ाइलों को हटा दें। क्या बनी हुई है फाइलों की एक सूची जिसे जेपीईजी के रूप में पहचाना नहीं जा सकता है।

एक पंक्ति

file *.jpg | grep -v "JPEG image data" 

में - की पुष्टि है कि JPEG image data वास्तव में एक सही ढंग से पहचान JPG फ़ाइल पर क्या file रिटर्न है सुनिश्चित करें। ..

file *.jpg | grep -v "JPEG image data" | sed 's/:.*//' 

जो मेरे बैश-फू का अंत है:

आप पेट के : के बाद सामान को हटाने और केवल फ़ाइल नाम के साथ अंत करने के लिए sed (1) उपयोग कर सकते हैं।इस बिंदु पर मैं परिणामस्वरूप सूची को एक फ़ाइल में संग्रहीत करूंगा (> list जोड़ें) और उचित नाम कमांड के लिए सभी पंक्तियों को फिर से लिखने के लिए एक टेक्स्ट एडिटर में जीआरईपी का उपयोग करें, फिर उसे चलाएं।

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