在非连续文件名的中间添加前导零

在非连续文件名的中间添加前导零

我有超过 1200 个文件(在子文件夹中),我必须通过在文件名中间添加前导零来重命名它们。我想这样做是因为我加载它们的程序不知道“10”在“2”后面。

下面是我所拥有的一个例子:

  • 玫瑰 MIDI 1 - C Maj.mid
  • 玫瑰 MIDI 1 - Var1.mid
  • Phantom MIDI Loop 26 - C 最小中音
  • Galaxy Chord MIDI 231 - A Min.mid
  • Posty MIDI 循环 1 - 100 BPM E Maj.mid

我希望它变成这样:

  • 玫瑰 MIDI001 - C 大中期
  • 玫瑰 MIDI001——Var1.mid
  • Phantom MIDI 循环026 - C 最小中
  • Galaxy Chord MIDI 231 - A Min.mid
  • Posty MIDI 循环009 - 160 BPM G# 最低中音

我使用以下 powershell 命令取得了一点成功:

get-childitem *.mid -recurse | foreach { rename-item $_ $_.Name.Replace("MIDI 1 ", "MIDI 001 ")}

这样会在“MIDI”后面的每个“1”前面添加 2 个零,后面有一个空格。我可以对所有要重命名的个位数执行此操作,但当您重命名到 10、20 等时,它就会崩溃。

是否有命令(或免费程序)可以自动帮我完成此操作?感觉应该有...但是,这是我第一次接触 powershell,所以我不确定它能做什么,以及它有什么局限性。

此外,如果它有帮助(我刚刚检查过)我想要在其前面添加零的数字始终是文件名中的第一个数字。

答案1

所以……看来我使用 powershell 的速度比我想象的要快。经过几个小时、头痛和 20 多个 google 标签后,我终于找到了答案:

get-childitem *.mid -recurse | foreach {
  $tmp = $_.Name
  $tmp = $tmp -split ' ';
  $noNum = $true;
  $tmp = foreach ($s in $tmp) {
    if($noNum){
      if($s -match "\b\d\b"){"00$s"; $noNum = $false}
      elseif($s -match "\b\d\d\b"){"0$s"; $noNum = $false}
      else{$s}
    }
    else {$s}
  }
  $tmp = $tmp -join ' ';
  rename-item $_ $tmp;
}

以及翻译:

get all midi files (including those in a subfolders) and loop through them.
  Create a temp var, and store the name of the midi file in it (no directory)
  Split temp at each ' '
  create noNum var and set it to false (this keeps track of if we've hit a number)
  loop through each substring in tmp, changing them as needed
    if we have not found the first number, check for it
      if the substring is a 1 digit num, add two 0s, and set noNum to false
      if the substring is a 2 digit num, add one 0, and set noNum to false
      else, not a number, just return substring
    else, first number found, just return substring
  join tmp substrings back together with a ' ' in between each one
  rename the file to tmp.

我确信有一个更优雅的解决方案(我很乐意看到!)但这对我来说有效=]


PS 如果其他人从 Cymatics 获得了 midi 文件,您可能需要运行以下命令来摆脱其前缀:

get-childitem *.mid -recurse | foreach { rename-item $_ $_.Name.Replace("Cymatics - ", "")}

然后/或

get-childitem *.mid -recurse | foreach { rename-item $_ $_.Name.Replace("Cymatics ", "")}

在我使用的程序中,前缀会使数字太长而无法看到。因此删除前缀是必须的。

相关内容