我有一个图库文件夹,其中的图像和视频以不需要的格式命名。我想制作一个脚本,扫描该目录中的每个文件,并在找到图像或视频时将其重命名为以下格式:“IMG_20190117_200445.jpg”Year,Month,Day_Hour,Minute,Second.Extension 与视频,但添加了视频扩展名。我怎样才能做到这一点 ?提前致谢。
答案1
这是一个我认为可以满足您要求的脚本。
我首先定义一个函数,它采用扩展名和类型(“IMG”或“VID”),用于find
获取具有该扩展名的所有常规文件,循环遍历它们,用于stat
确定它们的修改时间,date
以确定新文件名,并重命名它们。
该脚本首先将该函数应用于各种图像扩展,然后应用于各种视频扩展。
#!/bin/bash
# a function to rename all files with a given extension
# takes two arguments: the extension, plus either "IMG" or "VID"
rename_ext() {
# read the arguments to the function
local ext="$1"
local ftype="$2"
# loop over all files with that extension
while IFS= read -r -d '' filename ; do
# read the (sub)directory name
dirname="$(dirname "$filename")"
# find the modification time
modifytime="$(stat -c '%Y' "$filename")"
# determine the new name
local formatted="$(date +'%Y%m%d_%H%M%S' -d @$modifytime)"
local newname="${ftype}_${formatted}.${ext}"
# rename the file (and report that we are doing it)
echo renaming "$filename" to "$dirname/$newname"
mv -n "$filename" "$dirname/$newname"
done < <(find -iname "*.$ext" -type f -print0)
}
# run the function on various image extensions
for ext in apng avif bmp gif jpeg jpg png tif webp ; do
rename_ext "$ext" "IMG"
done
# run the function on various video extensions
for ext in avchd avif avi flv m2ts m4v mkv mov mp4 mpeg mpg mpv mts ogv qt vob webm wmv ; do
rename_ext "$ext" "VID"
done
您可能想尝试一次并mv
注释掉该行,以确保它符合您的预期。
您还可以考虑使用 exif 元数据而不是文件修改时间,但这会涉及更多一些。