我有以该样式命名的文件02.04.11 DJ Kilbot.mp3
(针对多个日期),并且我想以这种方式重新格式化名称:DJ Kilbot 2011-02-04.mp3
.换句话说,当前的格式是MM.DD.YY DJ-NAME.mp3
,我想将其更改为DJ-NAME YYYY-MM-DD.mp3
.对于几年的文件来说,最简单的方法是什么?
答案1
cd
到该目录,然后运行以下命令(使用perl-rename
)。这是首先的“预演”。
rename -n 's/^([0-9]{2})\.([0-9]{2})\.([0-9]{2}) (.*)\.mp3$/$4 20$3-$1-$2.mp3/' *
02.04.11 DJ Kilbot.mp3 -> DJ Kilbot 2011-02-04.mp3
如果您对输出感到满意,请实际运行它。
rename 's/^([0-9]{2})\.([0-9]{2})\.([0-9]{2}) (.*)\.mp3$/$4 20$3-$1-$2.mp3/' *
解释
rename -n
:运行测试“空运行”。's/FOO/BAR/'
替换正则表达式FOO
并替换为BAR
.^([0-9]{2})\.([0-9]{2})\.([0-9]{2}) (.*)\.mp3$
: 正则表达式来捕获。匹配字符串的开头,然后是由点分隔的^
三组(即两个连续数字)(转义时)。然后是一个空格和.括号捕获内容以用于替换。[0-9]{2}
\.
(.*)\.mp3$
()
$4 20$3-$1-$2.mp3
$4
:将第四个捕获组 ( ) 或以上的DJ 名称替换为(.*)
指定的字符串的其余部分(即第三、第一和第二组)。*
:作用于目录中的所有文件。
简化
该正则表达式内置了一些错误检查功能。如果您确定所有文件的命名一致,则可以将其稍微简化为以下内容。
rename 's/^(..)\.(..)\.(..) (.*)\.mp3$/$4 20$3-$1-$2.mp3/' *
答案2
没有rename
:
for file in *.mp3
do
no_extension=${file%.mp3}
the_date=$(echo "${no_extension}" | cut -d ' ' -f 1)
year=20${the_date:6}
month=${the_date:0:2}
day=${the_date:3:2}
date_part=${year}-${month}-${day}
dj_part=$(echo "${no_extension}" | cut -d ' ' -f 2-)
new_file="${dj_part} ${date_part}.mp3"
mv "${file}" "${new_file}"
done
解释:
for file in *.mp3
循环遍历当前目录中以.mp3
扩展名结尾的每个文件${file%.mp3}
.mp3
使用从文件末尾去除扩展名bash 字符串操作$(echo ${no_extension} | cut -d ' ' -f 2-)
使用该cut
实用程序提取文件名的日期部分,该实用程序可以解析字符分隔的字符串- 然后我们通过提取子字符串来更改日期的格式
"${dj_part} ${date_part}.mp3"
只是我们构建的部分的字符串连接mv "${file}" "${new_file}"
重命名文件
答案3
假设文件严格按照这种方式命名。
for file in "*.mp3";do
date="${file:0:8}" #get the date in the filename.
dj="${file%.mp3}" #strip the extension off the filename.
dj="${dj:8}" # get dj name.
mv -nv $file "$dj $date.mp3" # -n don't overwrite files.
done
答案4
py重命名器有一个 GUI 并允许自动预览。
将其放入原始文件名模式字段中:
{#}.{#}.{#} {X}.mp3
这进入重命名的文件名模式:
{4} {3}-{1}-{2}.mp3
唯一的缺点是它以“Windows”模式排序(1、10、11、2、3、4 ...)。