如何通过EXIF图像数据组织/排序图片

我从一个丢失的分区中恢复了图像,现在需要按照每张图片EXIF数据中的创建日期对它们进行排序或放入文件夹中。
我已经安装了digiKam和shotwell,但是在任何选项中都没有找到实现这一功能的方法。
请问有人能告诉我如何使用这两个程序或者其他任何方法来完成这个任务吗?
7个回答

我最喜欢的解决方案是将文件日期设置为与exif照片日期相同。这样做,您可以使用任何文件资源管理器工具对文件进行排序。
  1. 安装jheadapt-get install jhead
  2. 进入照片目录并运行此命令 jhead -ft *。这将使用exif元数据的创建日期在文件系统中设置文件日期。
  3. 现在只需转到顶部菜单(在Ubuntu中,您必须通过鼠标移动到监视器屏幕的顶部),选择View → Sort Images → By Date。

按日期排序图像将根据它们的创建或修改日期对文件进行排序。如果您刚刚恢复了许多文件,它们都将具有相同的日期。据我理解,EXIF元数据位于文件内部,不一定与文件本身的日期匹配。 - Mauricio Gracia Gutierrez

我推荐使用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

Scott,我需要在图片所在的文件夹上运行这个命令吗?我可以在Ubuntu下的NTFS挂载分区上运行吗? - Mauricio Gracia Gutierrez
2强制性的警告 -- 不要在你唯一的照片副本上尝试这个操作 -- 先备份一份副本,这样如果出错了,你可以重新开始。话虽如此,关于你的问题:是的,我认为是这样的。例如,如果你的“工作副本”存储在/home/me/Pictures/staging目录下,你应该先执行cd /home/me/Pictures/staging,然后再调用exiftool。 - Scott
同样的命令行在MS Windows上能用吗? - Mauricio Gracia Gutierrez
1根据阅读作者网站上的描述,我相信这样说:“ExifTool是一个独立于平台的Perl库,加上一个命令行应用程序,用于读取、写入和编辑各种文件中的元信息。”在Windows命令提示符中调用它之前可能需要进行一些特殊操作(请参见“Windows可执行文件”下面的说明),但一旦达到那个点,我预计所有平台上的命令和参数都将保持一致。 - Scott
使用 exiftool '-filename<CreateDate' -d %Y%m%d%H%M%S%-.4nc.%%le -r 命令可以提取照片的拍摄时间,并按照年月日时分秒的格式重命名文件。 - chloesoe

这是我正在使用的代码。它会将照片重命名为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

编辑。在这个修改中,标签中的日期被传递给名称,并且也通过touch属性传递给日期属性。此外,如果这些标签不存在,则将修改日期标签的日期传递给文件名。
#! /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" *

最简单的方法是使用: jhead -n%Y/%m/%d/%Y%m%d%H%M /Destination/*.jpg 它会将当前目录中的所有JPG文件按照年/月/日/年月日时分的格式进行排序、移动和重命名,生成一个漂亮的目录结构和唯一的文件名。
但请注意,它只适用于*.jpg文件,不适用于RAW文件。

注意:它从命令行末尾指定的路径中获取文件。:jhead -n%Y/%m/%d/%Y-%m-%d--%H%M-- *.jpg - Vedavrat

一个很棒的工具是Rapid Photo Downloader
1. 添加 PPA ``` sudo apt-add-repository ppa:dlynch3/ppa ```
2. 更新和安装 ``` sudo apt-get update sudo apt-get install rapid-photo-downloader ```
使用您的“丢失分区”作为输入源,并根据您在Rapid Photo Downloader中的Exif数据配置目标路径/文件名。

PPA已不再维护。尝试添加它并收到此消息: 此PPA现已过时。有关Rapid Photo Downloader的最新版本,请参见http://damonlynch.net/rapid/download.html。 - Corey S.

安装Phatch照片批处理器。从预定义的操作中,选择一个可以使用exif日期重命名文件的操作。

现在有一个名为nautilus-columns的扩展,它可以添加EXIF数据以及MP3(ID3),PDF和其他元数据。这些新列也可以用作排序来源。

安装方法如下:

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