【问题标题】:Renaming files - convert 'yyyyMMdd' to 'MMM-yy' within filename重命名文件 - 在文件名中将 'yyyyMMdd' 转换为 'MMM-yy'
【发布时间】:2012-06-20 06:35:51
【问题描述】:

我有一长串文件,它们都以“yyyyMMdd”格式的日期结尾,需要将它们更改为“MMM-yy”。最好的解决方法是什么?

例如 'file_one_20120620.pdf' > 'file_one_JUN-12.pdf'

  1. 使用正则表达式定位“日期”
  2. 提取和操作日期
  3. 重命名文件

Joey 在下面建议了一个 Powershell 脚本,它看起来应该可以工作,但我总是碰壁,即使在更改提供的代码时也是如此。任何帮助都会很棒,谢谢!

【问题讨论】:

  • 我认为您不能仅使用正则表达式将月份从数字转换为文本。
  • 听起来很危险。如果您有两个文件,一个名为 20120620,一个名为 20120605,该怎么办?会有碰撞。您的文件每个月每年都是唯一的吗?
  • @nhahtdh - 我不认为我可以,因为我无法从半空中提取文本 - stackoverflow.com/questions/5433313/… - 如果我可以做一些类似于 VBA 中 Sylvain Defresne 的答案的事情也许功能?
  • @RayToal 文件名各不相同,但最后的日期部分相同。
  • @Bonjour:我认为有可能,但我对VBA一无所知,所以我在这里帮不上忙。

标签: regex date powershell filenames


【解决方案1】:

您可以使用 PowerShell 做到这一点:

gci | # get files
  foreach {
    $newName = [Regex]::Replace($_.BaseName, '\d{8}$', {
      param($m)
      [datetime]::ParseExact($m.Value, 'yyyyMMdd', $null).ToString('dd-MMM')
    }) + $_.Extension
    Rename-Item $_ $newName
  }

【讨论】:

  • 看起来很完美,马上试试
  • 它似乎不起作用,仅将其中一个文件更改为“.pdf”,其余文件失败
  • 嗯;正则表达式部分工作正常(这是我最怀疑的)。不过,在这种情况下,您应该在 Rename-Item 上使用 -WhatIf 以防止数据丢失。我会在几分钟内尝试是否可以挽救它。
  • 感谢您迄今为止的帮助,非常感谢。附加的 -WhatIf 声明所有文件都将重命名为 .txt (因此失败)。当我绞尽脑汁想出最好的正则表达式时,你有没有机会再看看这个?
  • 您确定日期总是出现在最后并且完全采用这种格式吗?
【解决方案2】:
Get-ChildItem | # get files
foreach {
$newName = [Regex]::Replace($_.BaseName, '\d{8}$', {
  param($m)
  [datetime]::ParseExact($m.Value, 'yyyyMMdd', $null).ToString('dd-MMM')
}) + $_.Extension
Rename-Item $_ $newName -WhatIf
$_
$newname
}

这适用于我的测试列表,我所做的只是将 gci 更改为 get-childItem ..

如果:对目标“项目:C:\ab\file_four_20120701.txt 目标:C:\ab\file_four_01-Jul.txt”执行“重命名文件”操作。

如果:对目标“项目:C:\ab\file_one_20120620.txt 目标:C:\ab\file_one_20-Jun.txt”执行“重命名文件”操作。

如果:对目标“项目:C:\ab\file_three_20120622.txt 目标:C:\ab\file_three_22-Jun.txt”执行“重命名文件”操作。

如果:对目标“项目:C:\ab\file_two_20120621.txt 目标:C:\ab\file_two_21-Jun.txt”执行“重命名文件”操作。

【讨论】:

  • 是的,我真的不能告诉你为什么它对我不起作用。也许是放错地方或缺少图书馆?无论哪种方式,我都发布了最终适用于我的场景的 hacky 答案。感谢您的输入伙伴。
【解决方案3】:

感谢上面的Joey,这对我的情况很有帮助。

基于以下文件命名约定:

'file_one_20120622.pdf' 转换为 'file_one_JUN-22.pdf'

gci | #get files
  foreach {
    $newDate = [DateTime]::ParseExact($_.Name.Split('_')[2].Split('.')[0],'yyyyMMdd',$null).ToString('MMM-yy').ToUpper()
    $newFilename = $_.Name.Split('_')[0] + '_' + $_.Name.Split('_')[1] + '_' + $newDate + ".pdf"
    Rename-Item $_ $newFilename -WhatIf
  }

【讨论】:

    猜你喜欢
    • 2011-09-28
    • 2022-11-10
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 2013-08-27
    • 2017-12-12
    相关资源
    最近更新 更多