Linux-Shell:将文件重命名为创建时间

32

大家早上好,

我想为一个网站中的文件(图片)在一个文件夹中重新命名,由"1.jpg, 2.jpg, 3.jpg ..."变为"yyyymmdd_hhmmss.jpg"——所以我想读取创建时间并将这些时间作为图片的名称。有没有人知道如何使用Linux shell或ImageMagick来实现?

谢谢!


1
你是指文件在目录中创建的Unix时间还是文件中EXIF数据显示的照片拍摄时间? - Mark Setchell
1
看一下 jhead,这是一个很好的工具,可以用(或不用)EXIF数据重命名图片。 - freezed
5个回答

66

基于文件系统日期的命名

在Linux shell中:

for f in *.jpg
do
    mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"
done

说明:

  • for f in *.jpg do

    这启动了对所有jpeg文件的循环。 其特点是它将适用于所有文件名,即使文件名中有空格、制表符或其他困难字符。

  • mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"

    这将重命名文件。 它使用-r选项告诉date显示文件的日期而不是当前日期。 规范+"%Y%m%d_%H%M%S"告诉date按您指定的格式进行格式化。

    文件名$f在使用时放置在双引号中。 这确保奇怪的文件名不会导致错误。

    -n选项告诉mv永远不要覆盖现有文件。

  • done

    这完成了循环。

对于交互式使用,您可能更喜欢命令都在一行中。 在这种情况下,请使用:

for f in *.jpg; do mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"; done

基于EXIF创建日期进行命名

为了根据EXIF创建日期(而不是文件系统日期)来命名文件,我们需要使用exiftool或类似工具:

for f in *.jpg
do
    mv -n "$f" "$(exiftool -d "%Y%m%d_%H%M%S" -CreateDate "$f" | awk '{print $4".jpg"}')"
done

说明:

上述命令与文件日期命令非常相似,但使用exiftoolawk提取EXIF图像创建日期。

  • exiftool命令以以下格式提供日期:

  • $ exiftool -d "%Y%m%d_%H%M%S"  -CreateDate sample.jpg
    Create Date                     : 20121027_181338
    

    我们想要的实际日期是输出中的第四个字段。

  • 我们将exiftool输出传递给awk,以便它可以提取我们想要的字段:

  • awk '{print $4".jpg"}'
    

    这将选择日期字段,并添加.jpg扩展名。


2
另外,mv -n "$f" "$(stat -c '%W' "$f").jpg" 根据文件的创建日期进行重命名。实际上,date -d 命令给出的是最后修改时间(但我在 Cygwin + Windows 上)。 - robermann
1
完成后,对子文件夹执行相同操作:find . -type f | grep JPG$ | xargs -I{} sh -c 'mv -n "$1" $(date -r "$1" +"%Y%m%d_%H%M%S").jpg' - "{}" - debuti

8

感谢 @John1024 的帮助!

我需要同时按照最后修改日期,重命名不同扩展名的文件:

for f in *; do
  fn=$(basename "$f")
  mv "$fn" "$(date -r "$f" +"%Y-%m-%d_%H-%M-%S")_$fn"
done

"DSC_0189.JPG" ➜ "2016-02-21_18-22-15_DSC_0189.JPG"

"MOV_0131.avi" ➜ "2016-01-01_20-30-31_MOV_0131.avi"

如果您不想保留原始文件名:

mv "$fn" "$(date -r "$pathAndFileName" +"%Y-%m-%d_%H-%M-%S")"

希望这有助于像我一样的新手!


1
我创建了一个shell脚本;我认为它只适用于Mac,Linux可能需要其他参数。
#!/bin/bash

BASEDIR=$1;
for file in `ls -1 $BASEDIR`; do 
    TIMESTAMP=`stat -f "%B" $BASEDIR/$file`;
    DATENAME=`date -r $TIMESTAMP +'%Y%m%d-%H%M%S'`-$file
    mv -v $BASEDIR/$file $BASEDIR/$DATENAME;
done


当使用目录路径调用时,将该目录中的所有文件移动到以创建日期为前缀的新位置,例如:
../camera/P1210232.JPG -> ../camera/20220121-103456-P1210232.JPG

1

试试这个

for file in `ls -1 *.jpg`; do name=`stat -c %y $file | awk -F"." '{ print $1 }' | sed -e "s/\-//g" -e "s/\://g" -e "s/[ ]/_/g"`.jpg; mv $file $name; done

尽管可能有更简单的方法。

请提出建议 - CRAZY_LOVER

0
根据文件创建时间更改文件名:
exiftool "-filename<FileCreateDate" -d %Y%m%d_%H%M%S%z%%-c.%%le input.jpg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接