EXIF डेटा के आधार पर कई फोटो और वीडियो का नाम कैसे बदलें?


11

मैं अक्सर डिजिटल कैमरा और टैबलेट से अपने पीसी में फ़ोटो और वीडियो (ज्यादातर जेपीजी और एमओवी एक्सटेंशन वाले) आयात करता हूं, और मैं आदर्श रूप से उन्हें तारीखों और समय के अनुसार सॉर्ट करना देखना चाहूंगा जो कि उनके EXIF ​​डेटा में पहले से ही मौजूद थे । और इसलिए मेरी इच्छा है कि प्रत्येक फ़ाइलनाम से पहले दिनांक और समय टिकटों को अधिमानतः एक सरल Nautilus स्क्रिप्ट का उपयोग करके उन सभी का नाम बदलने के लिए ।

मैं अब तक केवल निम्नलिखित नॉटिलस स्क्रिप्ट को एक साथ लाने में कामयाब रहा, जो मुझे लगता है कि परिपूर्ण से बहुत दूर है:

for i in *.*
do
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}')_"$i"" 
done

इस नाम बदलने की विधि में मुझे जो पसंद नहीं है वह है EXIF ​​तारीख और समय टिकटों में उपयोग किए जाने वाले कॉलोन (जैसे "2013: 09: 03 20: 55: 09_IMG_0108.JPG") जो बाद में इन फ़ाइलों को अन्य वातावरणों में स्थानांतरित करते समय समस्याएँ पैदा कर सकते हैं ( जैसे विंडोज)।

यह आदेश (का उपयोग कर exiv2 के बजाय exiftool ) आसानी से दिनांक और समय टिकटों के हेरफेर में सक्षम बनाता है, लेकिन इसके दोष यह है कि यह है वीडियो (जैसे MOV) फ़ाइलें पर काम नहीं करता :

exiv2 -k -r '%Y-%m-%d_%H-%M-%S_:basename:' rename "$i"

इसलिए मैं उम्मीद कर रहा हूं कि कोई बेहतर समाधान निकाल सकता है। और अगर यह मूल फ़ाइल नाम और एक्सटेंशन को लोअरकेस में भी बदलने में कामयाब हो जाता है तो यह जादू होगा!


नीचे महान जवाब के अलावा आपको pyRenamer को भी देखना चाहिए । मुझे वीडियो फ़ाइलों के साथ इसका उपयोग करने का कोई अनुभव नहीं है, (क्या उनके पास EXIF ​​डेटा है?) लेकिन मैं कह सकता हूं कि यह तस्वीरों के लिए उत्कृष्ट है। यह फ़ाइल एक्सटेंशन को लोअरकेस में भी बदल सकता है।
टॉम ब्रॉसमैन

जवाबों:


6

इस नाम बदलने की विधि में मुझे जो पसंद नहीं है वह है EXIF ​​तारीख और समय टिकटों में उपयोग किए जाने वाले कॉलोन (जैसे "2013: 09: 03 20: 55: 09_IMG_0108.JPG") जो बाद में इन फ़ाइलों को अन्य वातावरणों में स्थानांतरित करते समय समस्याएँ पैदा कर सकते हैं ( जैसे विंडोज)।

आप sedकॉलिंग को बदलने के लिए, अंडरस्कोर के साथ कॉलोन और स्पेस के साथ कॉलिंग को बदल सकते हैं, जैसे:

mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$i"

पूरी चीज़ को कमतर बनाने के लिए, आप इसका उपयोग कर सकते हैं rename:

rename 's/(.*)/\L$1/' file.JPG
##  or
rename 's/(.*)/\L$1/' *.*

या आप इसे अपनी स्क्रिप्ट के भीतर प्रयोग कर सकते हैं sed, जैसे कि:

j=$(echo "$i" | sed -e 's/\(.*\)/\L\1/')

... और फिर अपनी लाइन $jके फाइनल $iके स्थान पर वैरिएबल का उपयोग करें mv। यह sed तरीका थोड़ा अधिक पोर्टेबल है (यदि यह आपके लिए मायने रखता है) क्योंकि अलग-अलग linux distros में अलग-अलग नाम कमांड होते हैं, जबकि sed सार्वभौमिक है।

या, वैकल्पिक रूप से, स्क्रिप्ट को trइसके बदले शुरुआत में लोअरकेस में फ़ाइल नाम रूपांतरण करने के लिए संशोधित किया जा सकता है :

for arg 
do
  tmp="$(echo "$arg" | tr '[A-Z]' '[a-z]')"
  mv -i "$arg" "$(exiftool -CreateDate "$arg" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$tmp"
done

विभिन्न फ़ाइल प्रकारों के लिए थोड़ा अलग कमांड करने के लिए, इस स्क्रिप्ट में एक बैश केस स्टेटमेंट का उपयोग किया जा सकता है। उदाहरण के लिए:

#! /usr/bin/env bash
for filename in ./*
do
  tmp="$(echo "$filename" | tr '[A-Z]' '[a-z]')"
  case "$filename" in
    *.MOV|*.mov) 
      mv -i "$filename" "$(exiftool -a -s -CreateDate-tur "$filename" | awk -F ': ' '{print $2}' | sed -e 's/\-[0-9][0-9]\:00//g' -e 's/\+[0-9][0-9]\:00//g' -e 's/:/-/g' -e 's/ /_/g')_$tmp"
      ;;
    *.JPG|*.jpg)
      mv -i "$filename" "$(exiftool -a -s -CreateDate "$filename" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_"$tmp""
      ;;
    *)
      echo 'Not a *.jpg or a *.mov!'
      ;;
  esac
done

इस उदाहरण में, MOV फ़ाइलों का नाम बदलना, जिनके पास CreateDate टाइमस्टैम्प्स हैं किसी भी समय के बाद या किसी अन्य JPG फ़ाइलों को किसी अन्य (-tur) EXIF ​​डेटा का उपयोग करके समायोजित किया जाता है और उस समय अंतर प्रत्यय को हटा दिया जाता है, और -tur भाग को बदलना आवश्यक हो सकता है सिस्टम में निर्धारित स्थान के अनुसार।


दुर्भाग्य से मैं यह नहीं पता लगा सका कि फाइलनाम को लोअरकेस में कैसे परिवर्तित किया जाए जैसा कि आप सुझाव देते हैं (ऊपर की पंक्ति को सम्मिलित करना और अंतिम $iको $jकुछ भी नहीं करने के लिए बदलना )। इसके बजाय, मैंने शुरुआत में लोअरकेस में फ़ाइल नाम रूपांतरण डाला और इसे आपके उत्तर के अंत में एक अन्य विकल्प (जो कम से कम मेरे लिए काम किया) के रूप में जोड़ने की स्वतंत्रता ली, ताकि मैं आपके उत्तर को स्वीकार कर सकूं। निश्चित रूप से आप अपने उत्तर को अपनी इच्छानुसार संपादित कर सकते हैं।
सादी

@ सादी इसे ताजी आँखों से देख रही है, मैं देख सकती हूँ कि मैं सेड कमांड के साथ क्या गलत कर रही थी। नवीनतम संस्करण काम करेगा, हालांकि अगर ट्राई विधि आपके लिए काम करती है तो यह ठीक है (मुझे इस बात का संदेह है कि ट्र सॉल्यूशन वास्तव में थोड़ा अधिक कुशल हो सकता है, हालांकि sed एक गैर-अंग्रेजी वर्णों को बेहतर तरीके से संभाल लेगा)
evilsoud

धन्यवाद। मुझे आश्चर्य है कि यदि आप MOV फ़ाइलों के लिए एक कमांड का उपयोग करके और लाइनों के साथ अन्य के लिए दूसरे का उपयोग करके इस स्क्रिप्ट को और बेहतर बनाने में मेरी मदद कर सकते हैं: यदि [एक्सटेंशन MOV है] blah blah; वरना ब्ला ब्ला। कारण यह है कि मुझे अपने MOV फ़ाइलों में "CreateDate" स्टैम्प का एहसास हुआ है (iPad से) अजीब तरह से +4 घंटे हैं और मुझे फ़ोटो और वीडियो का एक सटीक क्रम प्राप्त करने के लिए उनके लिए एक और विकल्प (CreateDate-tur) का उपयोग करने की आवश्यकता है ।
सादी १६'१३ को

उसके लिए सबसे अच्छा तरीका (मेरी राय में) एक केस स्टेटमेंट का उपयोग करना है; यहाँ कुछ आप शुरू करने के लिए है। आप एक if स्टेटमेंट का भी उपयोग कर सकते हैं, लेकिन अतिरिक्त फ़ाइल एक्सटेंशन के लिए केस स्टेटमेंट को और अधिक आसानी से विस्तारित किया जा सकता है। अधिक जानकारी के लिए 'बैश केस स्टेटमेंट' के लिए इंटरनेट पर खोजें।
evilsoup

बहुत - बहुत धन्यवाद!!! अगर आपको कोई आपत्ति नहीं है तो मैं इस विकल्प को भी उत्तर में जोड़ दूंगा।
सादी

13

मुझे अपनी तस्वीरों को फिर से नाम देने की जरूरत थी और यहाँ यह सवाल मिला - मुझे बस यह पता चला कि exiftoolइसे मूल रूप से संभालता हूँ:

से http://www.sno.phy.queensu.ca/~phil/exiftool/filename.html

exiftool -d %Y-%m-%d_%H-%M-%S%%-c.%%e "-filename<CreateDate" DIR 

यदि आप मूल फ़ाइलनाम का ट्रैक रखना चाहते हैं और एक्सटेंशन लोअर केस लिखना चाहते हैं:

exiftool -d %Y%m%d_%H%M%S%%-c-%%f.%%le "-filename<DateTimeOriginal" [.|DIR]

लोअरकेस में पूरे फ़ाइल नाम के साथ भी यही काम करता है:

exiftool -d %Y%m%d_%H%M%S%%-c-%%lf.%%le "-filename<DateTimeOriginal" [.|DIR]

डीआईआर वह फोल्डर होना चाहिए जहां तस्वीरें आवंटित की गई हैं। यदि हमने पहले से ही फोल्डर में एक टर्मिनल खोला है जहां हम कमांड निष्पादित करना चाहते हैं, तो हमें डीआईआर को प्रतिस्थापित करना होगा। और यदि आप एक उपसर्ग जोड़ना चाहते हैं, तो Filename (यानी IMG_) को बिना किसी उद्धरण के दिनांक श्रृंखला से पहले डाला जाना चाहिए। यहाँ एक उदाहरण: exiftool -d IMG_% Y% m% d_% H% M% S %% - c। %% e "-filename <CreateDate"।
नथोर


1

मैं इसके लिए उपयोग करूंगा krename। यह

  • लाइव पूर्वावलोकन दिखाता है
  • पूर्ववत करने की अनुमति देता है
  • पुनरावर्ती रूप से dir में जा सकते हैं
  • कई नाम बदलने की अनुमति देता है पैटर्न
  • ग्लब्स और पैटर्न में regexps की अनुमति देता है
  • इतिहास को याद करता है

0

Pyrenamer मेरे नए स्थापित Ubuntu 16.04 पर काम नहीं करेगा, इसलिए मुझे इस समस्या को हल करने के लिए एक और तरीका भी खोजना होगा।

मेरे पास एक फ़ोल्डर में IMG_0001.JPG, IMG_0002.JPG, ... जैसी फाइलें हैं। इस साइट की जाँच करें, /programming/917260/can-var-parameter-expansion-expressions-be-nested-in-bash

पहले "exiv2" स्थापित करें, और मैंने निम्नलिखित कमांड लाइन लिखी:

$ में img के लिए (ls *। [jj] [pp] [gg] 2> / dev / null); do exiv2 -r '% Y% m% d_% H% M% S _' "$ (tmp = $ {img %%। *}; गूंज $ {tmp ## * _})" नाम बदलें "$ img"; किया हुआ

आउटपुट फ़ाइल नाम YYYYMMDD_HHMMSS_0001.JPG, YYYMMDD_HHMMSS_0002.JPG, ... आदि हैं। यहां तक ​​कि फ़ोटो एक ही सेकंड में ली गई थीं, मूल फ़ोटो क्रमांक संख्या में फर्क पड़ेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.