根据创建的日期重命名JPG文件

Nei*_*val 26 unix linux command-line

我想重命名某个目录中的所有文件.将它们重命名为创建日期.
因此,如果我的文件是Image1.jpg,它应该重命名为"Jan 16 12:09:42 2011.jpg"
我想通过命令行执行此操作.我一直在努力:

stat -f %SB Image0100.jpg
Run Code Online (Sandbox Code Playgroud)

但是我如何将它与mv命令结合起来呢?我将如何迭代stat并遍历mv整个文件?
或者是否有简单的方法来重命名所有文件的日期创建?

小智 55

jhead -n DSCN0382.JPG
DSCN0382.JPG --> 0408-150734.jpg
Run Code Online (Sandbox Code Playgroud)

任何strftime参数也可以给出:

jhead -n%Y%m%d-%H%M%S *.jpg 
Run Code Online (Sandbox Code Playgroud)

这将以YYYYMMDD-HHMMSS格式重命名与*.jpg匹配的文件

jhead -n%Y%m%d-%H%M%S DSCN0382.JPG
DSCN0382.JPG --> 20120408-150734.jpg
Run Code Online (Sandbox Code Playgroud)

另请参阅手册页以获取许多其他很酷的选项.例如,您可以更正(转移)EXIF日期.当某些相机的时间设置不正确时,合并来自不同相机的文件时非常方便.

  • 我很快想从手册页添加:"如果目标名称已经存在,名称将附加"a","b","c"等,除非名称以字母结尾,在这种情况下它将附加"0","1","2"等." (5认同)

fse*_*eto 15

如果您正在使用包含EXIF数据的JPG (即来自数码相机),那么您可以使用以下来获取创建日期而不是stat.

exif -t 0x9003 -m Image0100.jpg
Run Code Online (Sandbox Code Playgroud)

每个请求,这是命令和输出.有几点需要注意:

  • 由于并非每个文件都有exif数据,因此我们希望dst在执行其余命令之前检查它是否有效.
  • exif的输出有一个空格,它是文件名的PITA.使用sed替换为' - '.
  • 请注意,我在mv之前使用'echo'来测试我的脚本.当你确信它正在做正确的事情时,那么你可以删除'echo'......你不想最终像那个让所有文件被吹走的人.

命令

for i in *.jpg; do
  dst=$(exif -t 0x9003 -m $i ) &&
  dst_esc=$(echo $dst | sed 's/ /-/g' ) &&
  echo mv $i $dst_esc.jpg
done
Run Code Online (Sandbox Code Playgroud)

产量

'12379632.jpg' does not contain tag 'DateTimeOriginal'.
mv 15084688.jpg 2003:02:28-21:48:54.jpg
mv 15136312.jpg 2003:03:01-10:36:05.jpg
mv 15137960.jpg 2003:03:01-10:36:38.jpg
mv 15140744.jpg 2003:03:01-10:37:46.jpg
Run Code Online (Sandbox Code Playgroud)

  • 我会添加第二个过滤器来删除":"字符,如果您打算与Windows操作系统共享文件,则必须添加!dst_esc = $(echo $ dst | sed's// - /g'| sed's /:/ - /g') (2认同)

gho*_*g74 5

for file in *jpg
do
 newfile=$(date "+%b %d %H:%M:%S%Y $file" -d "$(stat -c "%y" $file)")
 mv "$file" "$newfile"
done$
Run Code Online (Sandbox Code Playgroud)