使用批处理文件通过文件名的“子字符串”部分重命名文件

使用批处理文件通过文件名的“子字符串”部分重命名文件

我有大量文件想要使用批处理文件重命名,在本例中它们是音乐文件,以艺术家姓名、专辑、歌曲编号以及歌曲名称开头。

如果可能的话,我想在不安装任何软件包的情况下通过删除艺术家和专辑名称来重命名文件。

如改变:

Nahko 和人民的医学 - HOKA - 15 建造一座桥梁.wav

15 建一座桥.wav

首先想到的是:

是否可以将字符识别为数字? 如果可以,那么从数字到末尾对名称进行子串处理?

或者

检查其他文件上的公共子字符串并将其删除。

在上面的例子中,公共子字符串是:

Nahko 和人民的医学 - HOKA -

笔记: 如果专辑只有 9 首音乐,我不介意从 09 中删除可能的 0,但如果音乐数量超过 10 首,希望这不会删除 0,因为我希望数字按顺序排列歌曲,在这种情况下,音乐 2 将排在音乐 19 之后

答案1

切换C:\Temp到包含歌曲的文件夹并在 PowerShell 中运行此命令:

Get-ChildItem -Path "C:\Temp" -Recurse -Include "*.wav" | Rename-Item -NewName { $_.Name -replace '.*\b(\d+.*)','$1' }

答案2

这与我所寻找的一致:

  • 识别将字符串分成两部分的数字,
  • 保持简单,无需依赖和外部工具。

下面的块是脚本的相关摘录,其中%%c是歌曲的全名。

::with delayed expation enabled
setlocal EnableDelayedExpansion

::divide the full name into two tokens at the first digit
for /f "tokens=2,* delims=-" %%a in ('echo "%%c" ^| findstr /r "^[0-9]*"') do (
      set name=%%b 
)
rename "%%c" "!name:~0,-3!" 

注意:我不完全理解为什么文件名末尾有两个空格或不可见字符,需要从结果中删除两个字符(第三个是删除剩下"的)

例子:

Nahko And Medicine For The People - HOKA - 19 The Wolves Have Returned (feat. Trevor Hall、Xavier Rudd、Leah Song & Joseph).wav

结果

19 狼群归来 (feat. Trevor Hall、Xavier Rudd、Leah Song & Joseph).wav

答案3

使用Perl 的rename

$ rename 's/.*\b(\d+.*)/$1/' ./*.wav
$ ls
15 Build A Bridge.wav

正则表达式匹配如下:

节点 解释
.* 除 \n 之外的任意字符(0 次或更多次(匹配尽可能多的次数))
\b 单词字符 (\w) 与非单词字符之间的边界
( 分组并捕​​获到 $1:
\d+ 数字 (0-9)(1 次或多次(匹配最多的可能数量))
.* 除 \n 之外的任意字符(0 次或更多次(匹配尽可能多的次数))
) $1 结束

相关内容