Làm cách nào để đổi tên nhiều ảnh và video dựa trên dữ liệu EXIF?


11

Tôi thường nhập ảnh và video (chủ yếu có phần mở rộng JPG và MOV) từ máy ảnh và máy tính bảng kỹ thuật số vào PC của tôi và tôi lý tưởng muốn xem chúng được sắp xếp theo ngày và giờ chúng được chụp trong dữ liệu EXIF ​​của chúng. Và do đó, tôi muốn đổi tên tất cả chúng tốt nhất là sử dụng Tập lệnh Nautilus đơn giản bằng cách chèn tem ngày và thời gian trước mỗi tên tệp.

Cho đến nay tôi chỉ xoay sở để tập hợp Nautilus Script sau đây, điều mà tôi tin là không hoàn hảo:

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

Điều tôi không thích trong phương pháp đổi tên này là các dấu hai chấm được sử dụng trong tem ngày và thời gian EXIF (ví dụ: "2013: 09: 03 20: 55: 09_IMG_0108.JPG") có thể gây ra sự cố khi chuyển các tệp này sau sang các môi trường khác ( ví dụ: Windows).

Lệnh này (sử dụng exiv2 thay vì ExifTool ) thuận tiện cho phép thao tác của tem ngày tháng và thời gian nhưng nhược điểm của nó là nó không làm việc trên video (ví dụ như MOV) file :

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

Vì vậy, tôi hy vọng ai đó có thể đưa ra một giải pháp tốt hơn. Và sẽ thật kỳ diệu nếu nó thậm chí còn có thể chuyển đổi tên tập tin gốc và phần mở rộng thành chữ thường!


Ngoài những câu trả lời tuyệt vời dưới đây, bạn cũng nên kiểm tra pyRenamer . Tôi không có kinh nghiệm sử dụng nó với các tệp video, (họ có dữ liệu EXIF ​​không?) Nhưng tôi có thể nói nó rất tuyệt vời cho ảnh. Nó cũng có thể thay đổi phần mở rộng tập tin thành chữ thường.
Tom Brossman

Câu trả lời:


6

Điều tôi không thích trong phương pháp đổi tên này là các dấu hai chấm được sử dụng trong tem ngày và thời gian EXIF ​​(ví dụ: "2013: 09: 03 20: 55: 09_IMG_0108.JPG") có thể gây ra sự cố khi chuyển các tệp này sau sang các môi trường khác ( ví dụ: Windows).

Bạn có thể chạy sơ đồ đặt tên thông qua sed, để thay thế dấu hai chấm bằng dấu gạch ngang và dấu cách bằng dấu gạch dưới, như vậy:

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

Đối với việc làm cho toàn bộ chữ thường, bạn có thể sử dụng rename:

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

Hoặc bạn có thể làm điều đó trong tập lệnh của mình bằng cách sử dụng sed, như trong:

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

... Và sau đó sử dụng $jbiến thay cho cuối cùng $icủa mvdòng của bạn . Cách sed này dễ mang theo hơn một chút (nếu điều đó quan trọng với bạn) vì các distro linux khác nhau có các lệnh đổi tên khác nhau, trong khi sed là phổ biến.

Hoặc, thay vào đó, tập lệnh có thể được sửa đổi như sau để thực hiện chuyển đổi tên tệp thành chữ thường khi bắt đầu sử dụng trthay thế:

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

Để thực hiện các lệnh hơi khác nhau cho các loại tệp khác nhau, có thể sử dụng câu lệnh bash case trong tập lệnh này. Ví dụ:

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

Trong ví dụ này, việc đổi tên các tệp MOV có dấu thời gian CreatDate BẤT K hours số giờ SAU HOẶC TRƯỚC KHI tệp JPG được điều chỉnh bằng cách sử dụng dữ liệu EXIF ​​(-tur) khác và loại bỏ hậu tố chênh lệch thời gian đó và có thể cần phải thay đổi phần -tur theo vị trí đặt trong hệ thống.


Thật không may, tôi không thể tìm ra cách chuyển đổi tên tệp thành chữ thường như bạn đề xuất (chèn dòng đó ở trên và thay đổi dòng cuối cùng $iđể $jkhông làm gì cả). Thay vào đó, tôi đã chèn chuyển đổi tên tệp thành chữ thường ngay từ đầu và tự do thêm tùy chọn này làm tùy chọn khác (ít nhất là cho tôi) vào cuối câu trả lời của bạn để tôi có thể chấp nhận câu trả lời của bạn. Tất nhiên bạn có thể chỉnh sửa câu trả lời của bạn hơn nữa nếu bạn muốn.
Sadi

@sadi nhìn nó với đôi mắt tươi, tôi có thể thấy những gì tôi đã làm sai với lệnh sed. Phiên bản mới nhất sẽ hoạt động, mặc dù dĩ nhiên nếu phương pháp tr phù hợp với bạn thì vẫn ổn (tôi có một nghi ngờ lén lút rằng giải pháp tr có thể thực sự hiệu quả hơn một chút, mặc dù sed sẽ xử lý các ký tự không phải tiếng Anh tốt hơn)
evilsoup

Cảm ơn bạn. Tôi tự hỏi nếu bạn cũng có thể giúp tôi cải thiện hơn nữa tập lệnh này bằng cách sử dụng một lệnh cho các tệp MOV và một lệnh khác cho các dòng khác: nếu [phần mở rộng là MOV] blah blah; khác blah blah. Lý do là tôi vừa nhận ra tem "CreatDate" trong các tệp MOV của mình (từ iPad) có thời gian +4 giờ và tôi cần sử dụng một tùy chọn khác (CreatDate-tur) để chúng đạt được thứ tự chính xác của ảnh và video .
Sadi

Cách tốt nhất cho điều đó (theo tôi) là sử dụng một tuyên bố trường hợp; Đây là một cái gì đó để giúp bạn bắt đầu. Bạn cũng có thể sử dụng câu lệnh if, nhưng câu lệnh tình huống có thể được mở rộng dễ dàng hơn cho các phần mở rộng tệp bổ sung. Tìm kiếm trên internet cho 'tuyên bố trường hợp bash' để biết thêm thông tin.
evilsoup

Cảm ơn rất nhiều!!! Tôi cũng sẽ thêm tùy chọn này vào câu trả lời, nếu bạn không phiền.
Sadi

13

Tôi cần đổi tên ảnh của mình và tìm thấy câu hỏi này tại đây - Tôi chỉ phát hiện ra rằng exiftoolnó xử lý nó một cách tự nhiên:

Từ http://www.sno.phy.queensu.ca/~phil/exiftool/filename.html

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

Nếu bạn muốn theo dõi tên tệp gốc và viết phần mở rộng viết thường:

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

Các công việc tương tự cũng với toàn bộ tên tệp bằng chữ thường:

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

DIR phải là Thư mục nơi Ảnh được phân bổ. Nếu chúng ta đã mở Terminal trong Thư mục nơi chúng ta muốn thực thi Lệnh, chúng ta phải thay thế cho. Và nếu bạn muốn thêm Tiền tố, vào Tên tệp (tức là IMG_), phần này phải được chèn trước chuỗi ngày mà không có bất kỳ trích dẫn nào. Dưới đây là một ví dụ: exiftool -d IMG_% Y% m% d_% H% M% S %% - c. %% E "-filename <CreateDate".
Nothor

2

Tôi biết bạn đã nói rằng bạn thích một tập lệnh, tuy nhiên, nếu bạn mở một ứng dụng Java miễn phí, bạn có thể sử dụng AmoK Exif Sorter

nhập mô tả hình ảnh ở đây


1

Tôi sẽ sử dụng krenamecho việc này. Nó

  • hiển thị xem trước trực tiếp
  • cho phép hoàn tác
  • có thể đi đệ quy vào dir
  • cho phép nhiều mẫu đổi tên
  • cho phép các khối và regexps trong các mẫu
  • nhớ lịch sử

0

Pyrenamer sẽ không hoạt động trên Ubuntu 16.04 được cài đặt mới của tôi, do đó tôi cũng phải tìm một cách khác để giải quyết vấn đề này.

Tôi có các tệp như IMG_0001.JPG, IMG_0002.JPG, ... trong một thư mục. Kiểm tra trang web này, /programming/917260/can-var-parameter-Exansion-expressions-be-nested-in-bash

Trước tiên hãy cài đặt "exiv2" và tôi đã viết dòng lệnh sau:

cho img bằng $ (ls *. [Jj] [Pp] [Gg] 2> / dev / null); làm exiv2 -r '% Y% m% d_% H% M% S _' "$ (tmp = $ {img %%. *}; echo $ {tmp ## * _})" đổi tên "$ img"; làm xong

Tên tệp đầu ra là YYYYMMDD_HHMMSS_0001.JPG, YYYYMMDD_HHMMSS_0002.JPG, ... vv Ngay cả các ảnh được chụp ở cùng một giây, số sê-ri ảnh gốc sẽ tạo ra sự khác biệt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.