将文件名的中间部分移到前面

将文件名的中间部分移到前面

我有以该样式命名的文件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 ...)。

相关内容