EXIF ডেটা দিয়ে আমি কীভাবে ফটোগুলির নাম পরিবর্তন করতে পারি?


14

আসুন ধরা যাক আমার কাছে একগুচ্ছ ফটোগুলি রয়েছে, সবগুলিই সঠিক এক্সআইএফ তথ্য সহ, এবং ফটোগুলি এলোমেলোভাবে নামকরণ করা হয়েছে (আমার যে সমস্যার কারণে ছিল)। আমার একটি ছোট প্রোগ্রাম বলা হয়েছে jheadযা আমাকে নীচের আউটপুট দেয়:

$ jhead IMG_9563.JPG

File name    : IMG_9563.JPG
File size    : 638908 bytes
File date    : 2011:02:03 20:25:09
Camera make  : Canon
Camera model : Canon PowerShot SX210 IS
Date/Time    : 2011:02:03 20:20:24
Resolution   : 1500 x 2000
Flash used   : Yes (manual)
Focal length :  5.0mm  (35mm equivalent: 29mm)
CCD width    : 6.17mm
Exposure time: 0.0080 s  (1/125)
Aperture     : f/3.1
Focus dist.  : 0.29m
ISO equiv.   : 125
Exposure bias: -1.67
Whitebalance : Manual
Light Source : Daylight
Metering Mode: pattern
Exposure Mode: Manual

এখন আমাকে পরবর্তী ফর্ম্যাটে ফোল্ডারের সমস্ত ফটোগুলির নাম পরিবর্তন করতে হবে:

001.JPG
002.JPG
003.JPG
...

যেখানে নাবালিক সংখ্যাটি হবে পুরানো চিত্র এবং সর্বাধিক নতুন।

আমি এত ভাল স্ক্রিপ্টিং না, তাই আমি সাহায্যের জন্য বলছি।

আমি মনে করি একটি বাশ স্ক্রিপ্ট যথেষ্ট, তবে আপনি যদি আরও স্বাচ্ছন্দ্য বোধ করেন তবে আপনি পাইথন স্ক্রিপ্ট লিখতে পারেন।

আমি এমন কিছু ভেবেছিলাম:

$ mv IMG_9563.JPG `jhead IMG_9563.JPG | grep date`

তবে আমি জানি না কীভাবে একবারে সমস্ত ফাইলের জন্য এটি করা যায়।


আমি নাবালিক / সর্বাধিক বাক্য এবং পূর্ববর্তী উদাহরণটি বুঝতে পারি না। আপনি এই পরিষ্কার করতে পারেন?
maxschlepzig

সেই গৌণ / সর্বোচ্চ ফাইলের নাম এক ধাপ উপরে। কারণ, আমি একবার ফাইলগুলিকে এমনভাবে নাম দিয়েছি যা সেগুলি পুরানো এবং নতুনতর উপস্থাপন করে, আমি সহজেই অন্য প্রোগ্রামের সাথে 001.jpg, 002.jpg, ইত্যাদি নাম পরিবর্তন করতে পারি, যদিও অন্য স্ক্রিপ্টের সাহায্যে এটি করা ভাল।
টমাস

"নামকরণের টেবিল "টি হবে ls *.JPG | wc > renameএবং তারপরে আমাকে XXX এ স্ক্রিপ্টটির নামটি ব্যবহার করতে হবে J জেপিজি
টমাস

সরি, তা নয় wc, আমি নামটি দিয়ে অর্ডার করতে ভুলে গিয়েছিলাম।
টমাস

কমান্ডটি সাজানো।
টমাস

উত্তর:


10

লুপের জন্য (শেল / শেল-স্ক্রিপ্টে) ব্যবহার করে সমস্ত ফাইলের জন্য আপনি এটি করতে পারেন:

for i in *.JPG; do
  j=`jhead "$i" | grep date | sed 's/^File date[^:]\+: \(.\+\)$/\1/'`.jpg
  echo mv -i "$i" "$j"
done

এটি কেবল একটি খুব বেসিক রূপরেখা। echoআপনি যখন যাচাই করেছেন তা মুছে ফেলুন যখন প্রত্যাশা অনুযায়ী সবকিছুই কাজ করে।


ধন্যবাদ। এখন, গ্রেপ ওউডল আমাকে দিন File date : 2011:02:03 20:25:09। আমি কীভাবে কেবল দ্বিতীয় কলামটি ফিল্টার করতে পারি?
টমাস

সুতরাং আমি কেবল ফাইলটির নতুন নামকরণ করেছি 20:25:09
টমাস

@ টমাস, উত্তরটি আপডেট করেছেন - আপনি যদি সত্যিই কেবল সময় চান (তবে সংঘর্ষের কী হবে?) অবশ্যই আপনাকে অবশ্যই নিয়মিত অভিব্যক্তিটি পরিবর্তন করতে হবে।
ম্যাক্সচলেপজিগ

j=`jhead "$i" | grep date | sed 's/.* //'`.jpgপরিবর্তে?
উদ্ভট

@ ম্যাক্সলেপজিগ: ধন্যবাদ, আপনি 'before `.jpg`
টমাস

28

সবেমাত্র এখানে সন্ধান করা হয়েছে যে ঘাড আপনার পক্ষে এটি সব করতে পারে! :)

jhead -autorot -nf%Y-%m-%d_%H-%M-%S *.jpg

7
হ্যাঁ! তবে সেই নির্দিষ্ট ফর্ম্যাট-স্ট্রিং সম্পর্কে সতর্ক থাকুন, কারণ এটি একই সেকেন্ডে নেওয়া দুটি ফাইল একই নামে দেবে। %i(বা %03i, বিশেষত) মূল প্রশ্নে অনুরোধ অনুসারে একটি ক্রম সংখ্যা দেবে। উভয় সংমিশ্রণ একটি খারাপ ধারণা নাও হতে পারে।
ম্যাচটিএম

কেবল ম্যাডটেমের মন্তব্যের প্রতিক্রিয়া জানাতে - '' জেহেড '' ম্যানুয়ালটি প্রস্তাব দেয় যে এটি স্বয়ংক্রিয়ভাবে নকল (অভিন্ন টাইমস্ট্যাম্প) এর জন্য একটি অতিরিক্ত নম্বর বা চিঠি (1,2,3 বা a, b, c ইত্যাদি) যুক্ত করবে।
জন ইউ

0

কারও যদি আরও জটিল পুনরায় নাম প্রয়োজন হয়, উদাহরণস্বরূপ ফাইলের নামের সাথে কী এক্সপোজারের মানগুলি অন্তর্ভুক্ত করার জন্য, এটি আমার ছোট স্ক্রিপ্ট। এটা তোলে ভালো কিছু করার জন্য কোন JPEG ফাইল renames: NightSky_2014.08.27_22.30.05_NX20_F2.8_f20.0mm_20s_ISO800.jpg

#!/bin/bash

for s in *.jpg *.JPG
do
 echo $s
 x=`jhead "$s" | \
 awk 'BEGIN { cmt=""; }
/Camera model/   { c=$4$5$6;} 
/Exposure time:/ { e=$3; 
                   if (e==int(e)) e=int(e); 
                   if (e<1) {e=int(0.5+1/e); e="1T" e "s";} else { e=e "s"; } 
                 }
/ISO equiv./     { iso="ISO" $4; } 
/Focal length/   { f="f" $4; } 
/Date.Time /     { d=$3 "_" $4; gsub(":",".",d); }
/Aperture /      { ap=$3; gsub("f/","F",ap); } 
/Comment  /      { cmt=$3 "_"; }
END { print cmt d "_" c "_" ap "_" f "_" e "_" iso ".jpg"; }'`

 echo mv $s $x
 mv $s $x
 echo =====
done

0

আমি ম্যাক্সচেলেপজিগ পোস্ট করা কোডটি পছন্দ করেছি তবে তবে আউটপুট নিয়ে সমস্যা ছিল।

সমস্যাটি হ'ল ফলস্বরূপ ফাইলনামে (তারিখের স্ট্রিং এবং টাইম স্ট্রিংয়ের মধ্যে) স্থান। জিইউআই ব্যবহার করা যে কারও পক্ষে তুচ্ছ, কমান্ড-লাইনে ফাইল হ্যান্ডলিং কিছুটা আরও কঠিন করে তোলে।

এখানে 'সেড' কমান্ডটি পূর্ববর্তী একশাস্ত্র যুক্তির পক্ষে চারটি পৃথক 'সেড' ক্রিয়াকলাপে যথেষ্ট পরিবর্তন করা হয়েছে। আমার নিজের অনুসারে, নিম্নলিখিতটি ফাইলটিকে সাধারণ 64৪৪ টি অনুমতিতে পরিবর্তন করে।

for i in *.JPG ; do
  chmod 644 $i
  j=`jhead "$i" | grep ^Date/Time | sed -e 's/^Date\/Time[ ]\+: //;s/:/-/g;s/ /_/g':/-/g;s/ /_/g'`.jpg
  echo mv -i "$i" "$j"
  # mv -i "$i" "$j"
done

2
স্ট্যাক এক্সচেঞ্জে আপনাকে স্বাগতম। (1) আমি sedবেশ ভালভাবে বুঝতে পারি , তাই আপনি যা করার চেষ্টা করছেন তা আমি মূলত বুঝতে পারি। তবে স্ট্যাক এক্সচেঞ্জের আমাদের লক্ষ্যটি মাছের স্যান্ডউইচগুলি হস্তান্তর করা বা তুচ্ছ স্বতন্ত্র প্রশ্নগুলির হাজারো ওয়ান-অফ সমাধান না লিখানো; আমাদের লক্ষ্য হ'ল মানুষকে কীভাবে মাছ ধরতে হয় (অর্থাত্ বর্তমান প্রশ্নকর্তা এবং ভবিষ্যতের পাঠকগণকে কীভাবে তাদের নিজের সমস্যাগুলি সমাধান করতে হয় তা শেখানো)। সেই লক্ষ্যে, আপনি কী জোর প্রচেষ্টা করছেন তা যদি আপনি ব্যাখ্যা করেন তবে আপনার উত্তরটি আরও ভাল। (দয়া করে মন্তব্যে জবাব দেবেন না; এটি আরও পরিষ্কার করার জন্য আপনার উত্তরটি সম্পাদনা করুন…) ... (চালিয়ে যাওয়া)
জি-ম্যান বলেছেন 22

(চালিয়ে যাওয়া) ... (2) আপনার আদেশটি ব্যর্থ হয়েছে কারণ উদ্ধৃতিগুলি ভারসাম্যপূর্ণ নয়। দয়া করে অনির্ধারিত কোড পোস্ট করবেন না।
জি-ম্যান বলছেন 'পুনরায় ইনস্টল করুন মনিকা'

0

(ইমো) মোকাবেলা করা সহজ হওয়ায় আমি নিজে একটি রুবি স্ক্রিপ্ট লিখেছি:

require 'fileutils'

ARGV.each { |file|
  if File.exist?(file) && !File.directory?(file)
    exif = `exiftool "#{file}" | grep -E "(Error|Create Date)"`
    if exif.strip.size > 0
      exif = exif.split("\n")[0].split(/\s+/)
      if exif[0] != "Error"
        # Change the target format here
        filename = exif[3].gsub(":", "-") + " " + 
                   exif[4].gsub(":", ".") + 
                   File.extname(file)
        if filename != file && !File.exist?(filename)
          FileUtils::mv(file, File.dirname(file) + "/" + filename)
        end
      end
    end
  end
}

এটি কি করে?

  1. সমস্ত ফাইলের আইটেমগুলি প্যারামিটার হিসাবে পাস করেছে (যেমন *.JPG )।

    আমি পরীক্ষিত করেছি যে এটি RAW ফাইল এবং ভিডিওগুলি সঠিকভাবে পরিচালনা করে। এটি exiftoolমোকাবেলা করতে পারে সবকিছু সঙ্গে কাজ করা উচিত ।

  2. কোনও ফাইল করলে কিছুই হয় না

    • এটির অস্তিত্ব নেই,
    • একটি নির্দেশিকা,
    • একটি এক্সআইএফ তারিখ নেই, বা
    • exiftool একটি ত্রুটি রিপোর্ট, বা
    • লক্ষ্য ফাইল নামের একটি ফাইল ইতিমধ্যে বিদ্যমান।

এটি বেশ শক্তিশালী করে তোলে। বিশেষত, অন্যান্য উত্তরগুলির মতো কোনও ফাইলই নিঃশব্দে (নিঃশব্দে) নিখোঁজ হতে পারে না।


0

exiv2 কারসাজির জন্য বিকল্প হতে পারে, এটি একটি খুব সহজ বাক্য গঠন করতে দেয়:

exiv2 হ'ল এক্সিফ, আইপিটিসি, এক্সএমপি মেটাডেটা এবং চিত্রের মন্তব্যগুলি পড়ার এবং লেখার একটি প্রোগ্রাম এবং অনেক বিক্রেতা ম্যাকেরনোট ট্যাগ পড়তে পারেন। প্রোগ্রামটি allyচ্ছিকভাবে এক্সিফ ট্যাগ, এক্সএমপি বৈশিষ্ট্য এবং আইপিটিসি ডেটাসেটের মধ্যে ভার্টস কনট করে

সুতরাং এটি বর্তমান ফোল্ডারে সমস্ত জেপিগের নাম পরিবর্তন করবে:

for i in *.JPG; do exiv2 -v -r '%Y%m%d.%H%M%S.:basename:' rename "$i"; done

আপনি যদি ভূ-তথ্যও যুক্ত করতে চান তবে আপনি এটি ব্যবহার করতে পারেন exivtool:

exiftool '-filename<${gpslatitude;} ${gpslongitude} ${datetimeoriginal}' -d "%Y-%m-%d %H.%M.%S%%-c.%%e" *.JPG

0

আমি @ কেভিনের সমাধানটি পছন্দ করি, যেহেতু আমি মূল নামটিও একই সাথে রাখতে চেয়েছিলাম (একই দ্বিতীয় ছবিতে তোলা চিত্রগুলি নিয়ে সমস্যা এড়ানো), তাই এটি আমার সমাধান:

for i in *.JPG; do jhead -nf%Y%m%d_%H%M%S_"$(basename "$i" .JPG)" "$i" ; done

0

নবাগত প্রথম পোস্ট ... প্রথম বাশ স্ক্রিপ্ট ... আমি উপরে Libor / HalosGhost সমাধান পছন্দ করেছিলাম কারণ এটি পুনরায় নামকরণে আরও বিশদ অন্তর্ভুক্ত করে। তবে পরীক্ষার পরে, নকল ফাইলের নামগুলি ফাইলগুলি হারাতে পারে। সুতরাং আমি সহজ রেফারেন্স এবং সংঘর্ষ প্রতিরোধের জন্য ফাইলের নামের শেষে একটি পাল্টা ট্যাগ যুক্ত করেছি। আমি নিশ্চিত যে এখানে কেউ উন্নতি করতে পারে তবে ভেবেছিল এটি সাহায্য করতে পারে।

কোডটি পোস্ট করায় আমার ক্ষমাপ্রার্থী। ইন্টারফেসটি নিয়ে আমার অসুবিধা হচ্ছে তবে কেউ যদি আমাকে কাজগুলি করার পদ্ধতিটি সঠিকভাবে নির্দেশ করতে পারে তবে তা দুর্দান্ত।

#!/bin/bash

y=1
for s in *.jpg *.JPG
do
 echo $s
 x=`jhead "$s" | \
 awk 'BEGIN { cmt=""; }
/Camera model/   { c=$4$5$6;}
/Exposure time:/ { e=$3;
                   if (e==int(e)) e=int(e);
                   if (e<1) {e=int(0.5+1/e); e="1T" e "s";} else { e=e "s"; }
                 }
/ISO equiv./     { iso="ISO" $4; }
/Focal length/   { f="f" $4; }
/Date.Time /     { d=$3 "_" $4; gsub(":","",d); }
/Aperture /      { ap=$3; gsub("f/","F",ap); }
/Comment  /      { cmt=$3 "_"; }
END { print cmt d "_" c "_" ap "_" f "_" e "_" iso "_" ; }'`

 echo mv $s "$x${y}.jpg"
 mv $s "$x${y}.jpg"
 y=$((y+1))
 echo =====
done

আপনাকে সম্পাদনার জন্য স্টিফেন ধন্যবাদ। শেখার চেষ্টা করা হচ্ছে
jgroezin
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.