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?
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?
Câu trả lời:
Công cụ xử lý EXIF exiv2
có 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
. Trong thực tế, nó dường như thực sự làm thay thế những gì -T
.
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
exiftool
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 ".
$ 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
Nó cũng có thể được thực hiện bằng cách sử dụng jhead
lệnh:
$ jhead -ft file.jpg
-dsft
. -ft
làm ngược lại.
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.jpg
trước done
dòng.