按修改日期重命名文件

按修改日期重命名文件

我有一些 (96) 张图片需要重命名。我使用过的每个程序或脚本都会自动按旧名称对文件进行排序,但它们需要按修改日期顺序进行编号。

例如,一张照片拍摄于 2015 年 11 月 08 日 08:13:40,名为f67546288.jpg,第二张照片拍摄于 2015 年 11 月 08 日 08:13:46,名为f67553376.jpg

我不希望图像按字母顺序排列,而是按拍摄时间排列。

答案1

  1. 安装外置工具

  2. 使用它可以根据图片中的 exif 信息重命名文件。例如:

    for f in "$@"
    do
        exiftool -ext jpg -d %Y%m%d_%H%M%S%%+c.%%le "-filename<CreateDate" "$f"
    done
    

调整输出文件名格式以适应。

答案2

您可以使用自纪元以来的秒数修改时间戳

Unix 时间(也称为 POSIX 时间或错误地称为 Epoch 时间)是一种描述时间瞬间的系统

find . -type f -iname "*.JPG" -print0 | while read -d $'\0' file; do mv "$file" "$(stat -c %Y "$file")".jpg; done

例子

% ls -og
total 2796
-rw-r--r-- 1 2859518 Jan  2 11:26 IMG_20150102_112628_8902.JPG

% find . -type f -iname "*.JPG" -print0 | while read -d $'\0' file; do mv "$file" "$(stat -c %Y "$file")".jpg; done

% ls -og                                                            
total 2796
-rw-r--r-- 1 2859518 Jan  2 11:26 1420194390.jpg

% date -d @1420194390
Fr 2. Jan 11:26:30 CET 2015

解释

  • -iname "*.JPG"匹配所有 JPG,不区分大小写
  • -print0$'\0'文件名中可以​​有空格和换行符

man stat

%Y     time of last data modification, seconds since Epoch

如果您的图像有 exif 数据,那么您可以按照以下步骤操作。

安装exiftool

sudo apt-get install libimage-exiftool-perl

您可以使用以下命令:

cd <your_images_path>
exiftool '-filename<ModifyDate' -d %y%m%d_%H%M%S%%-c.%%le -r -ext jpg .

例子

% ls -og
total 2808
-rw-r--r-- 1 2859518 Jan  2 11:26 IMG_20150102_112628_8902.JPG
drwxrwxr-x 3    4096 Jun 14 12:12 source
drwxrwxr-x 2    4096 Jun 14 12:12 target

% exiftool '-filename<ModifyDate' -d %y%m%d_%H%M%S%%-c.%%le -r -ext jpg .
    3 directories scanned
    1 image files updated
% ls -og                 

total 2808
-rw-r--r-- 1 2859518 Jan  2 11:26 150102_112628.jpg
drwxrwxr-x 3    4096 Jun 14 12:12 source
drwxrwxr-x 2    4096 Jun 14 12:12 target

解释

  • -filename<ModifyDate表示使用图像的修改日期和时间重命名图像文件。

  • -d表示“设置日期/时间值的格式”。

  • %y%m%d_%H%M%S%%-c.%%le,与 一起使用,-d指定重命名文件时使用的日期和时间格式。格式分解如下:-%y%m%d_表示新文件名的第一部分应由创建日期年份的最后两位数字组成,后跟月份和日期,均用两位数字表示。下划线 _ 表示在文件名的日期部分后面添加下划线。

  • %H%M%S表示添加创建时间的时、分、秒,均用两位数字表示。
  • %%-c意思是,如果在命名过程中,两个图像的文件名相同,则添加“自动递增的副本编号”以赋予每个图像唯一的名称。请注意双倍的 %% — 这是必要的,因为我并不完全理解所谓的“转义”。在-“c”之前的 并不是必需的,但它会在副本编号前加一个破折号。
  • .%%le表示保留原始文件扩展名,但如果原来是大写,则将其改为小写,当相机坚持使用JPG而不是 时,这是一个不错的选择jpg。(如果您喜欢大写扩展名,请使用 .%%ue。如果您希望保留原始大小写,请使用 .%%e。)
  • -ext jpg表示仅重命名具有jpg扩展名的文件。要重命名源文件夹中的所有图像文件,请不要指定任何扩展名。 -r表示“对顶级“源”文件夹(即所有要重命名的文件所在的文件夹)中的每个图像文件以及所有源文件夹的子文件夹、子子文件夹等中的图像文件递归执行此命令”。

来源

答案3

重命名文件的经典方法是使用mvfor循环。stat -c %y filename给出上次修改的时间,与文件创建的时间相同。Stat 有文件出生日期 (%w),但它大多会失败,因此 %y 是首选

for file in *.png; do mv "$file" "$(stat -c %y "$file")".png; done

简单的解决方案,无需安装软件,即可完成工作

答案4

从 EXIF 中提取修改时间

$ find -name '[0-9][0-9]*' -type f -exec jhead -ft -n%Y%m%d_%H%M%S_%f {} +
./DCIM/103OLYMP/P5074367.JPG
./DCIM/103OLYMP/P5074367.JPG --> ./DCIM/103OLYMP/20160507_103229_P5074367.jpg
Not JPEG: ./DCIM/103OLYMP/P5074374.ORF
./DCIM/103OLYMP/P5074374.JPG
./DCIM/103OLYMP/P5074374.JPG --> ./DCIM/103OLYMP/20160507_131746_P5074374.jpg
Not JPEG: ./DCIM/103OLYMP/P5074376.ORF
Not JPEG: ./DCIM/BACKUP.HST

您还可以根据 JPEG/JPG 扩展名进行过滤:

find -name '[0-9][0-9]*' -o -iname '*.jp*g' -type f -exec jhead -ft -n%Y%m%d_%H%M%S_%f {} +

解释:

  • -name '[0-9][0-9]*'防止重命名已有日期前缀的文件('[0-9][0-9] 考虑年份和月份)
  • -iname '*.jp*g'仅对 JPG/JPEG 扩展文件应用重命名(可以跳过,因为 jhead 仅处理受支持的文件)
  • %f保留原始文件名

相关内容