วิธีการจัดระเบียบ / เรียงภาพตามข้อมูลภาพ EXIF


9

ฉันกู้คืนรูปภาพจากพาร์ติชั่นที่หายไปและฉันต้องการจัดเรียงหรือวางลงในโฟลเดอร์ตามวันที่สร้างในข้อมูล EXIF ​​ของแต่ละภาพ

ฉันได้ติดตั้ง digiKam และ shotwell แล้ว แต่ยังไม่พบวิธีการทำเช่นนี้กับตัวเลือกใด ๆ

ทุกคนสามารถอธิบายให้ฉันรู้ได้อย่างไรว่าจะทำอย่างไรกับโปรแกรมเหล่านั้นหรือโดยวิธีอื่นใด

คำตอบ:


14

ทางออกที่ฉันชอบคือการตั้งวันที่ของไฟล์เหมือนกับวันที่ถ่ายภาพ exif การทำเช่นนี้คุณสามารถจัดเรียงไฟล์โดยใช้เครื่องมือสำรวจไฟล์ใด ๆ

  1. ติดตั้งjhead ( apt-get install jhead)
  2. ไปที่ไดเรกทอรีรูปถ่ายและเรียกใช้คำสั่งjhead -ft *นี้ สิ่งนี้จะกำหนดวันที่ของไฟล์ในระบบไฟล์ด้วยวันที่สร้างของข้อมูลเมตา exif
  3. ตอนนี้เพียงไปที่เมนูด้านบน (ใน Ubuntu คุณใช้เมาส์ผ่านด้านบนสุดของหน้าจอมอนิเตอร์) เลือกมุมมอง→จัดเรียงภาพ→ตามวันที่

จัดเรียงรูปภาพตามวันที่จะเรียงลำดับไฟล์ตามวันที่สร้างหรือแก้ไข หากคุณกู้คืนไฟล์จำนวนมากไฟล์ทั้งหมดจะมีวันที่ที่เหมือนกัน เพื่อให้เข้าใจว่าข้อมูลเมตา EXIF ​​อยู่ในไฟล์และไม่จำเป็นต้องตรงกับวันที่ของไฟล์
Mauricio Gracia Gutierrez

7

ผมขอแนะนำให้ใช้exiftool คุณสามารถติดตั้งได้ด้วย

sudo apt install exiftool

นี่คือคำสั่งตัวอย่างที่เปลี่ยนชื่อไฟล์ตามวันที่สร้างในรูปแบบ YYYYMMDD และต่อท้ายหมายเลขลำดับท้าย

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

และนี่คือคำสั่งตัวอย่างที่ย้ายimage.jpgไปยังไดเรกทอรีที่มีวันที่สร้างเป็นชื่อในรูปแบบ 'YYYY-MM-DD'

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

มีคำสั่งตัวอย่างเพิ่มเติมในเอกสารประกอบ: https://sno.phy.queensu.ca/~phil/exiftool/filename.html


ฉันจะรันคำสั่งนี้ในโฟลเดอร์ที่มีภาพอยู่หรือไม่? ฉันสามารถรันสิ่งนี้บนพาร์ติชันที่ติดตั้ง NTFS ภายใต้ Ubuntu ได้หรือไม่
Mauricio Gracia Gutierrez

2
คำเตือนที่บังคับใช้ - อย่าลองทำสิ่งนี้กับสำเนาภาพถ่ายเหล่านี้เท่านั้น - ทำสำเนาสำรองก่อนเพื่อที่ว่าหากคุณทำเสร็จแล้วคุณสามารถเริ่มใหม่ได้ ที่กล่าวเกี่ยวกับคำถามของคุณ: ใช่และฉันคิดอย่างนั้น ตัวอย่างเช่นหากสำเนาการทำงานของคุณถูกเก็บไว้ใน / home / me / Pictures / staging คุณต้องดำเนินการcd /home/me/Pictures/stagingก่อนจากนั้นจึงเรียกใช้ exiftool
สกอตต์

บรรทัดคำสั่งเดียวกันจะทำงานกับ MS Windows ได้หรือไม่
Mauricio Gracia Gutierrez

จากการอ่านคำอธิบายบนเว็บไซต์ของผู้เขียนฉันเชื่อว่า: "ExifTool เป็นห้องสมุด Perl ที่ไม่ขึ้นกับแพลตฟอร์มรวมถึงแอพพลิเคชั่นบรรทัดคำสั่งสำหรับการอ่านเขียนและแก้ไขข้อมูลเมตาในไฟล์ที่หลากหลาย" อาจมีบางสิ่งที่พิเศษที่คุณต้องทำก่อนที่คุณจะสามารถเรียกใช้งานได้จากพรอมต์คำสั่งใน Windows (ดูที่คำสั่ง "Windows ปฏิบัติการ") แต่ฉันคาดว่าคำสั่งและพารามิเตอร์ทั้งหมดจะเหมือนกันในทุกแพลตฟอร์มเมื่อคุณ ไปที่จุดนั้น
สกอตต์

1

เครื่องมือที่ยอดเยี่ยมคือRapid Photo Downloader

  1. เพิ่ม PPA

    sudo apt-add-repository ppa:dlynch3/ppa
    
  2. การอัพเดตและการติดตั้ง

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

ใช้ "Lost partition" ของคุณเป็นแหล่งอินพุตและกำหนดค่าพา ธ / ชื่อไฟล์เป้าหมายตามข้อมูล exif ของคุณใน Rapid Photo Downloader


PPA ไม่ได้รับการบำรุงรักษาอีกต่อไป พยายามที่จะเพิ่มและได้รับข้อความนี้: PPA นี้ล้าสมัยแล้ว สำหรับรุ่นล่าสุดของ Rapid Photo Downloader ดูdamonlynch.net/rapid/download.html
Corey S.

1

ติดตั้งโปรเซสเซอร์ชุด Phatch Photo จากการกระทำที่กำหนดไว้ล่วงหน้าให้เลือกไฟล์ที่เปลี่ยนชื่อไฟล์ด้วยวันที่จาก exif


1

ใช้ง่ายที่สุด: jhead -n%Y/%m/%d/%Y%m%d%H%M /Destination/*.jpg

มันจะเรียงลำดับย้ายและเปลี่ยนชื่อ JPG ของคุณทั้งหมดจากไดเรกทอรีปัจจุบันไปสู่โครงสร้างไดเรกทอรีที่ดีด้วยชื่อไฟล์ที่ไม่ซ้ำกัน /Year/Month/Day/YearMonthDayHourMinute.jpg

ใช้งานได้กับไฟล์ * .jpg เท่านั้นซึ่งไม่ใช่ไฟล์ RAW


หมายเหตุ: ใช้ไฟล์จากพา ธ ซึ่งระบุไว้ที่ท้ายบรรทัดคำสั่ง : jhead -n%Y/%m/%d/%Y-%m-%d--%H%M-- *.jpg
Vedavrat

1

ขณะนี้มีส่วนขยายที่เรียกว่าnautilus-columnซึ่งเพิ่มข้อมูล EXIF ​​รวมถึง MP3 (ID3), PDF และข้อมูลเมตาเพิ่มเติม คอลัมน์ใหม่เหล่านี้สามารถใช้เป็นแหล่งจัดเรียงได้

ติดตั้งด้วย:

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


1

นี่คือรหัสที่ฉันใช้ มันเปลี่ยนชื่อรูปภาพที่เพิ่ม YYYYMMDD_originalname.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

แก้ไข ในการปรับเปลี่ยนนี้วันที่ในแท็กจะถูกส่งผ่านไปยังชื่อและไปยังแอตทริบิวต์วันที่ด้วยการสัมผัส นอกจากนี้หากแท็กเหล่านั้นไม่มีอยู่วันที่ของแท็กการแก้ไขจะถูกส่งผ่านไปยังชื่อของไฟล์

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

สำหรับการเรียงลำดับในโฟลเดอร์ (ปีและเดือน) (YYYYMM):

exiftool "-Directory<DateTimeOriginal" -d "%Y%m" *
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.