GNU/Linux >> Belajar Linux >  >> Ubuntu

Bagaimana Cara Mengganti Nama Banyak Foto Dan Video Berdasarkan Data Exif?

Saya sering mengimpor foto dan video (kebanyakan memiliki ekstensi JPG dan MOV) dari kamera digital dan tablet ke PC saya, dan saya ingin melihatnya diurutkan berdasarkan tanggal dan waktu pengambilannya sudah ada dalam data EXIF ​​mereka. Dan karenanya keinginan saya untuk mengganti nama mereka semua sebaiknya menggunakan Script Nautilus sederhana sebaiknya dengan memasukkan cap tanggal dan waktu sebelum setiap nama file.

Sejauh ini saya hanya berhasil menyatukan Skrip Nautilus berikut, yang menurut saya jauh dari sempurna:

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

Yang tidak saya sukai dalam metode penggantian nama ini adalah titik dua yang digunakan dalam cap tanggal dan waktu EXIF (mis. “2013:09:03 20:55:09_IMG_0108.JPG”) yang mungkin menimbulkan masalah saat mentransfer file ini nanti ke lingkungan lain (mis. Windows).

Perintah ini (menggunakan exiv2 alih-alih exiftool ) dengan mudah memungkinkan manipulasi cap tanggal dan waktu tetapi kekurangannya adalah tidak berfungsi pada file video (mis. MOV) :

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

Jadi, saya berharap seseorang dapat memberikan solusi yang lebih baik. Dan akan menjadi ajaib jika bahkan berhasil mengubah nama file dan ekstensi asli menjadi huruf kecil juga!

Jawaban yang Diterima:

Apa yang saya tidak suka dalam metode penggantian nama ini adalah titik dua yang digunakan dalam stempel tanggal dan waktu EXIF ​​(mis. misalnya Windows).

Anda dapat menjalankan skema penamaan melalui sed , untuk mengganti titik dua dengan tanda hubung dan spasi dengan garis bawah, seperti:

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

Untuk membuat semuanya menjadi huruf kecil, Anda bisa menggunakan rename :

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

Atau Anda bisa melakukannya di dalam skrip Anda menggunakan sed , seperti dalam:

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

…dan kemudian gunakan $j variabel sebagai pengganti $i final terakhir dari mv . Anda garis. Cara sed ini sedikit lebih portabel (jika itu penting bagi Anda) karena distro linux yang berbeda memiliki perintah rename yang berbeda, sedangkan sed bersifat universal.

Atau, sebagai alternatif, skrip dapat dimodifikasi sebagai berikut untuk melakukan konversi nama file ke huruf kecil di awal menggunakan tr sebagai gantinya:

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

Untuk melakukan perintah yang sedikit berbeda untuk jenis file yang berbeda, pernyataan kasus bash dapat digunakan dalam skrip ini. Misalnya:

#! /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

Dalam contoh ini, mengganti nama file MOV yang memiliki stempel waktu CreateDate NOMOR jam SETELAH ATAU SEBELUM file JPG disesuaikan dengan menggunakan data EXIF ​​(-tur) lain dan menghapus akhiran perbedaan waktu itu, dan mungkin perlu diubah -tur bagian sesuai dengan lokasi yang diatur dalam sistem.


Ubuntu
  1. Cara Menemukan dan Menghapus Foto Duplikat di Linux

  2. Bagaimana Cara Mengganti Nama Pengguna dengan Aman?

  3. Bagaimana Cara Mengatur / Mengurutkan Gambar Berdasarkan Data Gambar Exif?

  1. Mengapa Data Penting Dan Bagaimana Cara Melindunginya

  2. Bagaimana Cara Mengganti Nama Banyak File Menggunakan Find?

  3. Cara Memulai dan Menghentikan OSWatcher

  1. Cara Mengganti Nama Cabang Git Lokal dan Jarak Jauh

  2. Cara Mengganti Nama Banyak File Sekaligus di Linux

  3. Cara Mengganti Nama Cabang Git Lokal dan Jarak Jauh