Thay đổi ngày tạo tệp từ siêu dữ liệu JPEG EXIF


29

Khi tải lên một trang web ftp, ngày tạo tệp gốc dường như bị mất và thay vào đó tôi nhận được ngày tải lên. Tuy nhiên, dữ liệu Exif trong tệp là chính xác. Có một công cụ để thay đổi hàng loạt ngày đã tạo từ ngày Exif không?


1
Vui lòng xem xét chấp nhận câu trả lời mà bạn thấy hữu ích nhất. Bằng cách này, những người khác tìm kiếm câu hỏi này sẽ thấy nó được đánh dấu là "đã trả lời". Đó cũng là một cách để thưởng cho một người đã dành thời gian của họ để giúp bạn.
Dmitry Grigoryev

Câu trả lời:


27

Công cụ xử lý EXIF exiv2có tùy chọn dựng sẵn cho việc này:

exiv2 -T rename image.jpg

đặt thời gian sửa đổi tệp cuối cùng mtime, thành ngày được lưu trữ trong siêu dữ liệu EXIF.

Bạn đã yêu cầu sử dụng thời gian tạo - nhưng điều đó không được sử dụng trong các hệ thống giống Unix - và có những lý do chính đáng cho điều đó: https://unix.stackexchange.com/questions/27297/why-doesnt-nix-keep-track -of-file-created-time

Tôi khá chắc chắn rằng thời gian bạn gọi tạo thời gian thực sự là mtime- không có vấn đề ở đó.


Từ man exiv2:

NAME
        exiv2 - Image metadata manipulation tool

 SYNOPSIS
        exiv2 [options] [action] file ...

 DESCRIPTION
        exiv2 is a program to read and write Exif, IPTC and XMP image metadata and image com‐
        ments. The following image formats are supported:

 [ ... ]

 mv | rename
       Rename files and/or set file timestamps according to the Exif create time‐
       stamp.  Uses  the  value  of  tag  Exif.Photo.DateTimeOriginal  or, if not
       present, Exif.Image.DateTime to determine the timestamp. The filename for‐
       mat can be set with -r fmt, timestamp options are -t and -T.

 [ ... ]

 -T     Only  set  the  file  timestamp according to the Exif create timestamp, do not
        rename the file (overrides -k). This option is only  used  with  the  'rename'
        action.  Note:  On Windows you may have to set the TZ environment variable for
        this option to work correctly.


Xem tùy chọn -tđể làm ngược lại.


Tôi sẽ hiểu "ngược lại" có nghĩa là đặt dấu thời gian EXIF ​​từ dấu thời gian của tệp, nhưng đây không phải là cái gì -t. Trong thực tế, nó dường như thực sự làm thay thế những gì -T.
Michael

7

Nếu bạn cài đặt exiftool từ CPAN, bạn có thể chạy đoạn mã sau, giả sử rằng tất cả các tệp của bạn nằm trong một thư mục có tên là "tất cả"

#!/bin/sh
for i in all/*; do
    SPEC=`exiftool -t -s -d "%Y-%m-%d %H:%M:%S" -CreateDate "$i"`
    read X DATE <<<${SPEC}
    echo "$i:$DATE"
    touch -d "$DATE" "$i"
done

bạn có thể mô tả những gì kịch bản này đang làm? Cụ thể là các đối số choexiftool
user5359531

5

Giả sử, như được đề cập bởi 'Volker Siegel', rằng bạn có thể có nghĩa là thời gian, tôi sẽ đơn giản sử dụng hàm exiftools dựng sẵn ..

như:

 $ exiftool "-DateTimeOriginal>FileModifyDate" test.jpg

việc này sẽ lấy thông tin "trường exif" DateTimeOrigen "và sử dụng thông tin đó để đặt thông tin ngày / giờ được sửa đổi của hệ thống tệp của tệp" test.jpg ".

Thí dụ:

$ ls -la test.jpg
-rw-r-----@ 1 user  18329968  2432451 14 Out 17:57 test.jpg

$ exiftool -DateTimeOriginal test.jpg
Date/Time Original              : 2015:10:09 13:29:58

$ exiftool "-DateTimeOriginal>FileModifyDate" test.jpg
    1 image files updated

$ ls -la test.jpg
-rw-r-----@ 1 user  18329968  2432451  9 Out 13:29 test.jpg

4

Nó cũng có thể được thực hiện bằng cách sử dụng jheadlệnh:

$ jhead -ft file.jpg

Đối với Jhead 3.0, tùy chọn là -dsft. -ftlàm ngược lại.
Tesquin Crydd

jhead dường như là công cụ EXIF duy nhất không hoạt động với tiêu đề EXIF ​​- exiftool và exiv2 thực sự làm tăng kích thước của tệp và di chuyển các tiêu đề xung quanh, điều này hoàn toàn không thể chấp nhận được đối với tôi.
Michael

3

ExifTool có thể đọc và thao tác với hầu hết các thông tin EXIF, bao gồm trích xuất các thẻ EXIF ​​gốc / ngày gốc hoặc tạo dữ liệu. Bạn có thể sử dụng thông tin này để đổi tên các tệp hoặc thay đổi dấu thời gian của chúng. Ví dụ:

find -name '*.jpg' | while read PIC; do
    DATE=$(exiftool -p '$DateTimeOriginal' $PIC |
    sed 's/[: ]//g')
    touch -t $(echo $DATE | sed 's/\(..$\)/\.\1/') $PIC
done

Điều này sẽ tìm thấy tất cả các tệp JPG trong thư mục hiện tại và cập nhật dấu thời gian.

Nếu bạn cũng muốn đặt tên cho các tệp đó dựa trên ngày đó (điều này có xu hướng có ích) thì cũng nên thêm mv -i $PIC $(dirname $PIC)/$DATE.jpgtrước donedòng.

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.