批量删除文件夹名称中的不规则后缀

批量删除文件夹名称中的不规则后缀

我有一系列以以下方式命名的文件夹:

11.23 John Smith
12.912 Kate Spade
23.34 Alexander McQueen
22.E01 Michael Kors

我想将文件夹名称重命名为:

11.23
12.912
23.34
22.E01

唯一的一致性是数字和人名之间始终有一个空格。

我尝试使用下面这段代码但它删除了前缀而不是后缀:

Get-ChildItem | foreach {Rename-Item $_ $_.Name.Replace("Prefix", "")}

答案1

你可以使用这个:

Get-ChildItem -Directory | % { Rename-Item $_.FullName ($_.Name -replace '^(\S+) .*', '$1')}

分解:

  • Get-ChildItem -Directory- 获取子目录
  • | % {}- 将它们通过管道传输到Foreach-Object( %)
  • Rename-Item $_.FullName ($_.Name -replace '^(\S+) .*', '$1')- 根据全名(更安全)重命名为使用正则表达式替换的名称。^(\S)匹配字符串开头(^)中不是空格的任何内容作为一个组,后跟一个空格。.*匹配此后的任何内容。

如果您想确保文件夹匹配,正则表达式可能会更强大。例如:

^(\d+\.[\dE]+) \w+ \w+$

它匹配第二部分可以有小数点的数字E,后面跟着两个单词。这符合您的示例,但不确定它是否满足您需要的所有要求,因此上面的方法在工作方面更可靠。

Prefix您的代码没有完成任何事情,它只是试图从名称中删除该词。

答案2

如果第一个字段后总有一个空格,那么你可以使用这个

Get-ChildItem -Directory | Rename-Item -NewName { ($_.Name -split " ")[0] } -WhatIf

别名版本:

ls -Di | ren -New { ($_.Name -split " ")[0] } -wi

-WhatIf/-wi是进行试运行,删除它才能进行真正的重命名

这比使用正则表达式简单得多。-split运算符将名称拆分为一个数组,我们只需取第一个标记并将其用作文件夹的新名称

TIO 上的演示

相关内容