Cách sắp xếp / sắp xếp hình ảnh theo dữ liệu hình ảnh EXIF


9

Tôi đã khôi phục hình ảnh từ một phân vùng bị mất và tôi cần sắp xếp chúng hoặc đặt chúng vào một thư mục trước ngày tạo trong dữ liệu EXIF ​​của mỗi hình ảnh.

Tôi đã cài đặt digiKam và cả shotwell nhưng chưa tìm được cách thực hiện điều này trên bất kỳ tùy chọn nào.

Bất cứ ai có thể giải thích cho tôi làm thế nào để làm điều đó với một trong những chương trình đó hoặc bằng bất kỳ phương pháp nào khác không?

Câu trả lời:


14

Giải pháp yêu thích của tôi là đặt ngày của tệp giống với ngày ảnh exif. Làm điều này, bạn có thể sắp xếp các tệp bằng bất kỳ công cụ thám hiểm tệp.

  1. Cài đặt jhead ( apt-get install jhead)
  2. Đi đến thư mục ảnh và chạy lệnh này jhead -ft *. Điều này sẽ đặt ngày tệp trong hệ thống tệp với ngày tạo của siêu dữ liệu exif
  3. Bây giờ chỉ cần chuyển đến menu trên cùng (trong Ubuntu bạn hầu hết đi bằng chuột qua đầu màn hình điều khiển), chọn Xem → Sắp xếp hình ảnh → Theo ngày.

Sắp xếp hình ảnh theo ngày sẽ sắp xếp các tệp theo ngày chúng được tạo hoặc sửa đổi. Nếu bạn vừa phục hồi nhiều tệp, tất cả chúng sẽ có cùng NGÀY. Theo hiểu biết của tôi, siêu dữ liệu EXIF ​​nằm trong tệp và không nhất thiết phải khớp với ngày của chính tệp đó
Mauricio Gracia Gutierrez

7

Tôi khuyên bạn nên sử dụng exiftool . Bạn có thể cài đặt nó với

sudo apt install exiftool

Đây là một lệnh mẫu đổi tên các tệp dựa trên ngày tạo ở định dạng YYYYMMDD và nối thêm số thứ tự ở cuối.

exiftool '-filename<CreateDate' -d %Y%m%d%%-.4nc.%%le -r

Và đây là một lệnh mẫu di chuyển image.jpgvào một thư mục có ngày tạo như tên của nó, ở định dạng 'YYYY-MM-DD'.

exiftool -d %Y-%m-%d "-directory<datetimeoriginal" image.jpg

Có nhiều lệnh mẫu hơn trong tài liệu: https://sno.phy.queensu.ca/~phil/exiftool/filename.html


Scott tôi có chạy lệnh này trên thư mục chứa hình ảnh không? Tôi có thể chạy cái này trên phân vùng được gắn NTFS trong Ubuntu không?
Mauricio Gracia Gutierrez

2
Lời cảnh báo bắt buộc - đừng thử điều này trên bản sao duy nhất của những bức ảnh này - hãy tạo một bản sao lưu trước để nếu bạn thực hiện nó, bạn có thể bắt đầu lại. Điều đó nói rằng, liên quan đến câu hỏi của bạn: Có, và tôi nghĩ vậy. Ví dụ: nếu các bản sao làm việc của bạn được lưu trữ trong / home / me / Pictures / staging, bạn sẽ thực hiện cd /home/me/Pictures/stagingtrước, sau đó gọi exiftool.
Scott

Liệu dòng lệnh tương tự có hoạt động với MS Windows không?
Mauricio Gracia Gutierrez

Dựa trên việc đọc mô tả trên trang web của tác giả, tôi tin như vậy: "ExifTool là một thư viện Perl độc lập với nền tảng cộng với một ứng dụng dòng lệnh để đọc, viết và chỉnh sửa thông tin meta trong nhiều loại tệp." Có thể có một số điều đặc biệt bạn phải làm trước khi bạn có thể gọi nó từ dấu nhắc lệnh trong Windows (xem phần bên dưới ghi "Windows Executable"), nhưng tôi hy vọng tất cả các lệnh và tham số sẽ giống nhau trong tất cả các nền tảng khi bạn đến điểm đó
Scott

1

Một công cụ tuyệt vời là Rapid Photo Downloader

  1. Thêm PPA

    sudo apt-add-repository ppa:dlynch3/ppa
    
  2. Cập nhật và cài đặt

    sudo apt-get update
    sudo apt-get install rapid-photo-downloader
    

Sử dụng "phân vùng bị mất" làm nguồn đầu vào và định cấu hình đường dẫn / tên tệp đích dựa trên dữ liệu exif của bạn trong Rapid Photo Downloader


PPA không còn được duy trì. Đã thử thêm nó và nhận được thông báo này: PPA này hiện đã lỗi thời. Để biết phiên bản mới nhất của Rapid Photo Downloader, hãy xem damonlynch.net/rapid/doad.html
Corey S.

1

Cài đặt bộ xử lý hàng loạt Phatch Photo. Từ các hành động được xác định trước, chọn một hành động đổi tên các tệp có ngày từ exif.


1

Sử dụng đơn giản nhất: jhead -n%Y/%m/%d/%Y%m%d%H%M /Destination/*.jpg

Nó sẽ sắp xếp, di chuyển và đổi tên tất cả các JPG của bạn từ thư mục hiện tại thành cấu trúc thư mục đẹp với tên tệp duy nhất /Year/Month/Day/YearMonthDayHourMinute.jpg

Nó chỉ hoạt động trên các tệp * .jpg chứ không phải RAW


Lưu ý: nó lấy các tệp từ đường dẫn, được chỉ định ở cuối dòng lệnh : jhead -n%Y/%m/%d/%Y-%m-%d--%H%M-- *.jpg
Vedavrat

1

Hiện tại có một phần mở rộng được gọi là nautilus-cột , bổ sung dữ liệu EXIF ​​cũng như MP3 (ID3), PDF và nhiều siêu dữ liệu hơn. Những cột mới này cũng có thể được sử dụng làm nguồn sắp xếp.

Cài đặt với:

sudo add-apt-repository ppa:atarea/nautilus-extensions
sudo apt update
sudo apt install nautilus-columns


1

Đây là mã tôi đang sử dụng. Nó đổi tên các ảnh thêm YYYYMMDD_origenname.jpg

#! /bin/bash
shopt -s globstar || exit
for PIC in **
do
# look only for jpg
if [[ "$PIC" =~ \.JPG$ ]] || [[ "$PIC" =~ \.jpg$ ]]; then
    # ignore jpg that have 8 numbers at beginning followed by _ or after IMG_ or P_ and followed by _ (already date stamped)
    if [[ "$PIC" =~ [[:digit:]]{8}_.*$ ]] || [[ "$PIC" =~ IMG_[[:digit:]]{8}_.*$] ]] || [[ "$PIC" =~ P_[[:digit:]]{8}_.*$] ]]; then
    :
    else
        # get the date and time from the tag
        DATE=$(exiftool -p '$DateTimeOriginal' "$PIC" | sed 's/[: ]//g')
        echo "file_$PIC"
        # customize date, in this case eliminate the time, getting only the date in 8 numbers and adding _
        DATEMOD2=$(echo $DATE | sed -e 's/^\(.\{8\}\).*/\1_/')
        echo "datemod2_$DATEMOD2"
            # check if DateTimeOriginal was present
            if [[ "$PIC" == "$DATEMOD2$PIC" ]];then
            # as DateTimeOriginal is not present try with HistoryWhen
            DATE=$(exiftool -p '$HistoryWhen' "$PIC" | sed 's/[: ]//g')
            DATEMOD2B=$(echo $DATE | sed -e 's/^\(.\{8\}\).*/\1_/')
            echo "datemod2B_$DATEMOD2B"
                # check if HistoryWhen is present
                if [[ "$PIC" == "$DATEMOD2B$PIC" ]];then
                # nor the tag DateTimeOriginal, nor HistoryWhen present
                echo "skip"
                else
                # this will be done
                echo "mv -i "$PIC" $(dirname "$PIC")/"$DATEMOD2B""$PIC""
                #uncomment if you like it
                #mv -i "$PIC" $(dirname "$PIC")/"$DATEMOD2B""$PIC"
                fi
            else
            # this will be done
            echo "mv -i "$PIC" $(dirname "$PIC")/"$DATEMOD2""$PIC""
            #uncomment if you like it
            #mv -i "$PIC" $(dirname "$PIC")/"$DATEMOD2""$PIC"
            fi
     fi
fi
done

BIÊN TẬP. Trong sửa đổi này, ngày trong thẻ được chuyển đến tên và cả thuộc tính ngày bằng cảm ứng. Ngoài ra, nếu các thẻ đó không tồn tại, ngày sửa đổi thẻ được chuyển sang tên của tệp.

#! /bin/bash
shopt -s globstar || exit
for PIC in **
do
# look only for jpg
if [[ "$PIC" =~ \.JPG$ ]] || [[ "$PIC" =~ \.jpg$ ]]; then
        echo "file_$PIC"
        # get the date and time from the tag DateTimeOriginal
        DATE=$(exiftool -p '$DateTimeOriginal' "$PIC" | sed 's/[: ]//g')
        LONGDATE=$(echo $DATE | sed -e 's/^\(.\{12\}\).*/\1/')
            # check if DateTimeOriginal is 0000... OR empty
            if [[ "$LONGDATE" != "000000000000" ]] && [[ -n "$LONGDATE" ]]; then
            echo "datetimeoriginal_$LONGDATE"
            # modify the attribute date with the info in the tag date
            touch -t $LONGDATE "$PIC"
            # customize date, in this case eliminate the time, getting only the date in 8 numbers and adding _
            DATEMOD2=$(echo $DATE | sed -e 's/^\(.\{8\}\).*/\1_/')
            echo "datemod2_$DATEMOD2"
                    # skip renaming if
                    # 8 numbers at beginning followed by _ or after IMG_ or P_ and followed by _ (already date stamped)
                    if [[ "$PIC" =~ [[:digit:]]{8}_.*$ ]] || [[ "$PIC" =~ IMG_[[:digit:]]{8}_.*$] ]] || [[ "$PIC" =~ P_[[:digit:]]{8}_.*$] ]]; then
                    :
                    else
                    # this will be done

                    filename=$(basename "$PIC")
                    echo "$filename"
                    echo "mv -i \""$PIC"\" \""$(dirname "$PIC")"/"$DATEMOD2""$filename"\""
                    #uncomment if you like it
                    mv -i "$PIC" "$(dirname "$PIC")/$DATEMOD2$filename"

                    fi
            else
            # get the date and time from the tag HistoryWhen

            DATE=$(exiftool -p '$HistoryWhen' "$PIC" | sed 's/[: ]//g')
            LONGDATE=$(echo $DATE | sed -e 's/^\(.\{12\}\).*/\1/')

            # check if Historywhen is 0000... or empty
                if [[ "$LONGDATE" != "000000000000" ]] && [[ -n "$LONGDATE" ]]; then
                echo "historywhentag_$LONGDATE"

                touch -t $LONGDATE "$PIC"
                DATEMOD2B=$(echo $DATE | sed -e 's/^\(.\{8\}\).*/\1_/')
                echo "datemod2B_$DATEMOD2B"

                    if [[ "$PIC" =~ [[:digit:]]{8}_.*$ ]] || [[ "$PIC" =~ IMG_[[:digit:]]{8}_.*$] ]] || [[ "$PIC" =~ P_[[:digit:]]{8}_.*$] ]]; then
                    :
                    else
                    # this will be done             
                    filename=$(basename "$PIC")
                    echo "$filename"
                    echo "mv -i \""$PIC"\" \""$(dirname "$PIC")"/"$DATEMOD2B""$filename"\""
                    #uncomment if you like it
                    mv -i "$PIC" "$(dirname "$PIC")/$DATEMOD2B$filename"
                    fi

                else
                    # get the date and time from the tag tag filemodifydate

                    DATE=$(exiftool -p '$filemodifydate' "$PIC" | sed 's/[: ]//g')
                    LONGDATE=$(echo $DATE | sed -e 's/^\(.\{12\}\).*/\1/')

                    # check if filemodifydate is 0000... or  empty
                    if [[ "$LONGDATE" != "000000000000" ]] && [[ -n "$LONGDATE" ]]; then
                    #echo "filemodifydatetag_$LONGDATE"

                    #touch -t $LONGDATE "$PIC"
                    DATEMOD2C=$(echo $DATE | sed -e 's/^\(.\{8\}\).*/\1_/')
                    echo "datemod2C_$DATEMOD2C"

                        if [[ "$PIC" =~ [[:digit:]]{8}_.*$ ]] || [[ "$PIC" =~ IMG_[[:digit:]]{8}_.*$] ]] || [[ "$PIC" =~ P_[[:digit:]]{8}_.*$] ]]; then
                        :
                        else
                        # this will be done             
                        filename=$(basename "$PIC")
                        echo "$filename"
                        echo "mv -i \""$PIC"\" \""$(dirname "$PIC")"/"$DATEMOD2C""$filename"\""
                        #uncomment if you like it
                        mv -i "$PIC" "$(dirname "$PIC")/$DATEMOD2C$filename"
                        fi

                    else

                    echo "Error, NO date available"
                    fi
                fi
            fi
fi
done

Để sắp xếp trong các thư mục (năm và tháng) (YYYYMM):

exiftool "-Directory<DateTimeOriginal" -d "%Y%m" *
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.