Đổi tên hình ảnh thành exif time: Tạo tên tệp độc đáo


11

Nếu tôi đổi tên hình ảnh qua exiv thành thời gian ngày exif, tôi sẽ làm như sau:

find . -iname \*jpg -exec exiv2 -v -t -r '%Y_%m_%d__%H_%M_%S' rename {} \;

Bây giờ có thể xảy ra rằng hình ảnh có cùng dấu thời gian (bao gồm cả giây). Làm thế nào tôi có thể làm cho tên tệp duy nhất tự động?

Lệnh phải ổn định theo nghĩa là nếu tôi thực hiện lại trên cùng một cấu trúc thư mục (có lẽ sau khi thêm ảnh mới), các ảnh đã được đổi tên không nên thay đổi và nếu ảnh có tên tệp đã có thì tên tệp mới sẽ là duy nhất cũng.

Nỗ lực đầu tiên của tôi chỉ là để lại tên cơ sở ban đầu trong tên tệp kết quả, nhưng sau đó lệnh sẽ không ổn định theo nghĩa ở trên.


1
Trích xuất dấu thời gian, xây dựng tên tệp, kiểm tra tên tệp hiện có, sửa đổi (thêm hậu tố hoặc tương tự) nếu có, sau đó mvlà tệp.
Kusalananda

Có cách nào trực tiếp hơn bằng cách thêm một tùy chọn vào lệnh exiv2 không?
sinh viên

Vì vậy, câu trả lời bằng exiftool sẽ là một cái gì đó như : exiftool '-filename<createdate' -d %Y_%m_%d__%H_%M_%S%%-c.%%le "-filemodifydate<createdate#" -r -progress .. Có lẽ bạn có thể chuyển bình luận của bạn để trả lời.
sinh viên

Câu trả lời:


17

jheadThay vào đó, bạn có thể muốn thử dùng cái nào đó (với a, b... zhậu tố cho phép tối đa 27 tệp có cùng ngày) và không có vấn đề ổn định được đề cập bởi @meuh:

find . -iname '*jpg' -exec jhead -n%Y_%m_%d__%H_%M_%S {} +

Hoặc sử dụng exiftool(ví dụ trong trang man):

exiftool -ext jpg '-FileName<CreateDate' -d %Y_%m_%d__%H_%M_%S%%-c.%%e .

(ở đây với %-cmột hậu tố số bắt đầu bằng -)


3

Phiên bản của tôi exiv2(0,25 001900) sẽ hỏi tương tác phải làm gì khi tên tệp đã tồn tại.

exiv2: File `./2013_06_19__14_03_13.jpg' exists. [O]verwrite, [r]ename or [s]kip? 

Bằng cách thêm tùy chọn -F, thay vào đó, nó sẽ tự động thêm một _1(hoặc _2vv) vào tên.

Renaming file to ./2013_06_19__14_01_53_1.jpg, updating timestamp

Nếu lệnh được chạy lần thứ hai, nó báo:

This file already has the correct name

và không làm gì cả, nhưng nó bị lẫn lộn nếu có _1phần đó, và sẽ đổi tên nó _2. Nó sẽ chuyển đổi như thế này theo cách không phá hủy trên mỗi lần chạy. Bạn có thể bỏ qua điều này nếu bạn thích hoặc thay đổi findmẫu của bạn để bỏ qua các tệp khớp với mẫu ngày với một _phần.

Ví dụ, mẫu regex cho định dạng ngày bắt đầu [0-9]{4}_[0-9]{2}_.... Để đơn giản hóa, tôi sẽ chỉ tìm một hỗn hợp gồm 20 ký tự từ bộ 0..9_, đó là regex [0-9_]{20}. Với điều này, hậu tố _theo sau ít nhất 1 chữ số để tìm là _[0-9]{1,}.jpg. Vì regex phải khớp với toàn bộ đường dẫn, và không chỉ tên cơ sở, regex cuối cùng bao gồm cả thư mục là .*/[0-9_]{20}_[0-9]{1,}.jpg.

Vì vậy, bạn có thể sử dụng một tìm như:

find . -regextype posix-extended ! -iregex '.*/[0-9_]{20}_[0-9]{1,}.jpg' -iname '*.jpg' ...

1

Exiv2 có thể tự xử lý nó. Tôi cũng đã dành rất nhiều thời gian để tìm kiếm sự giúp đỡ về điều này, cho đến khi tôi đi xem hướng dẫn sử dụng exiv2. Tùy chọn -F giải quyết vấn đề này.

exiv2 -r'%Y_%m_%d__%H_%M_%S' -F *.jpg

Nó sẽ nối thêm _N ở cuối nếu tệp đã tồn tại.

Và cho những người đang tìm kiếm một tùy chọn cho phép tạo thư mục.

exiftool -r '-FileName<DateTimeOriginal' -d %Y/%m/%d/%%f%%-c.%%e *

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.