Cara mengatur / mengurutkan gambar berdasarkan data gambar EXIF


9

Saya telah memulihkan gambar dari partisi yang hilang dan saya perlu mengurutkannya atau meletakkannya di folder pada tanggal pembuatan di data EXIF ​​dari setiap gambar.

Saya telah menginstal digiKam dan juga shotwell tetapi belum menemukan cara untuk melakukan ini pada salah satu opsi.

Adakah yang bisa menjelaskan kepada saya bagaimana melakukannya dengan salah satu dari program tersebut atau dengan metode lain?

Jawaban:


14

Solusi favorit saya adalah mengatur tanggal file sama dengan tanggal foto exif. Melakukan ini, Anda dapat mengurutkan file menggunakan alat explorer file apa pun.

  1. Pasang jhead ( apt-get install jhead)
  2. Buka direktori foto dan jalankan perintah ini jhead -ft *. Ini akan mengatur tanggal file di sistem file dengan tanggal buat dari exad metadata
  3. Sekarang, masuk saja ke menu atas (di Ubuntu Anda paling sering menggunakan mouse melalui bagian atas layar monitor), pilih View → Sort Images → By Date.

Sortir Gambar berdasarkan Tanggal akan memesan file berdasarkan tanggal dibuat atau dimodifikasi. Jika Anda baru saja memulihkan banyak file, semuanya akan memiliki TANGGAL yang sama. Untuk pemahaman saya, metadata EXIF ​​ada di dalam file dan tidak selalu cocok dengan tanggal file itu sendiri
Mauricio Gracia Gutierrez

7

Saya sarankan menggunakan exiftool . Anda dapat menginstalnya dengan

sudo apt install exiftool

Berikut adalah contoh perintah yang mengganti nama file berdasarkan tanggal pembuatan dalam format YYYYMMDD dan menambahkan nomor urut di akhir.

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

Dan inilah perintah sampel yang bergerak image.jpgke direktori dengan tanggal pembuatannya sebagai namanya, dalam format 'YYYY-MM-DD'.

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

Ada lebih banyak contoh perintah dalam dokumentasi: https://sno.phy.queensu.ca/~phil/exiftool/filename.html


Scott, apakah saya menjalankan perintah ini di folder tempat gambar berada? Dapatkah saya menjalankan ini pada partisi yang dipasang NTFS di Ubuntu?
Mauricio Gracia Gutierrez

2
Kata peringatan wajib - jangan coba ini hanya pada salinan foto-foto ini - buat salinan cadangan terlebih dahulu sehingga, jika Anda memperbaikinya, Anda dapat memulai dari awal. Yang mengatakan, mengenai pertanyaan Anda: Ya, dan saya pikir begitu. Misalnya, jika copy pekerjaan Anda disimpan di / home / me / Pictures / staging, Anda harus melakukannya cd /home/me/Pictures/stagingterlebih dahulu, lalu panggil exiftool.
Scott

Apakah baris perintah yang sama berfungsi untuk MS Windows?
Mauricio Gracia Gutierrez

Berdasarkan membaca deskripsi di situs web penulis, saya percaya demikian: "ExifTool adalah perpustakaan Perl platform-independen ditambah aplikasi baris perintah untuk membaca, menulis dan mengedit informasi meta dalam berbagai file." Mungkin ada sesuatu yang istimewa yang harus Anda lakukan sebelum Anda dapat memintanya dari command prompt di Windows (lihat di bawah di mana dikatakan "Windows Executable"), tapi saya berharap semua perintah dan parameter sama di semua platform setelah Anda sampai ke titik itu.
Scott

1

Alat hebat adalah Rapid Photo Downloader

  1. Menambahkan PPA

    sudo apt-add-repository ppa:dlynch3/ppa
    
  2. Memperbarui dan menginstal

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

Gunakan "partisi hilang" Anda sebagai sumber input dan konfigurasikan jalur target / nama file berdasarkan data exif Anda di Rapid Photo Downloader


PPA tidak lagi dipertahankan. Mencoba menambahkannya dan menerima pesan ini: PPA ini sekarang kedaluwarsa. Untuk versi terbaru Rapid Photo Downloader, lihat damonlynch.net/rapid/download.html
Corey S.

1

Instal prosesor batch Phatch Photo. Dari tindakan yang telah ditentukan, pilih salah satu yang mengubah nama file dengan tanggal dari exif.


1

Sederhana menggunakan: jhead -n%Y/%m/%d/%Y%m%d%H%M /Destination/*.jpg

Ini akan mengurutkan, memindahkan, dan mengganti nama semua JPG Anda dari direktori saat ini ke dalam struktur direktori yang bagus dengan nama file unik /Year/Month/Day/YearMonthDayHourMinute.jpg

Ini hanya berfungsi pada file * .jpg adonan, bukan RAW


Catatan: dibutuhkan file dari path, yang ditentukan pada akhir baris perintah : jhead -n%Y/%m/%d/%Y-%m-%d--%H%M-- *.jpg
Vedavrat

1

Sekarang ada ekstensi yang disebut nautilus-kolom , yang menambahkan data EXIF ​​serta MP3 (ID3), PDF dan lebih banyak metadata. Kolom baru ini juga dapat digunakan sebagai sumber penyortiran.

Instal dengan:

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


1

Ini adalah kode yang saya gunakan. Itu mengubah nama foto menambahkan 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

EDIT. Dalam modifikasi ini, tanggal pada tag dilewatkan ke nama dan juga atribut tanggal dengan sentuhan. Juga, jika tag tersebut tidak ada, tanggal tag modifikasi dilewatkan ke nama file.

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

Untuk menyortir folder (tahun dan bulan) (YYYYMM):

exiftool "-Directory<DateTimeOriginal" -d "%Y%m" *
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.