我有一些 (96) 张图片需要重命名。我使用过的每个程序或脚本都会自动按旧名称对文件进行排序,但它们需要按修改日期顺序进行编号。
例如,一张照片拍摄于 2015 年 11 月 08 日 08:13:40,名为f67546288.jpg
,第二张照片拍摄于 2015 年 11 月 08 日 08:13:46,名为f67553376.jpg
。
我不希望图像按字母顺序排列,而是按拍摄时间排列。
答案1
安装外置工具
使用它可以根据图片中的 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
重命名文件的经典方法是使用mv
并for
循环。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
保留原始文件名