如何用文件名中的现有Unix时间重命名多个文件?

问题描述 投票:1回答:3

虽然我知道如何在PHP中执行此操作,但安装IIS没有意义,只是为了完成此操作而安装PHP。

我有一个文件夹D:\Data,里面有几个子文件夹。这些文件夹包含的文件是使用程序创建的备份,该程序为名称添加时间戳以允许备份文件的多个副本。

这些文件需要命名:

usera.dat

但它们目前被命名为:

usera.dat.17383947323.dat  

在PHP中,我将文件名加载到一个字符串中,在“。”上展开字符串,然后使用[0]和[3]元素重命名文件以重命名文件,即没有循环来读取目录:

$filename = $existing_file
$explodename = explode(".",$filename);
$newfilename = $explodename[0] . "." . $explodename[3];
rename($filename, $newfilename);

有没有人建议如何使用PowerShell或循环遍历D:\Data中所有子文件夹的批处理文件?

现在我手动编辑每个文件,删除额外的Unix时间戳.dat部分。

windows file powershell batch-file
3个回答
1
投票

从提示中批量生成一行:

@FOR /r "U:\sourcedir" %a IN (*) DO @FOR %b IN ("%~na") DO @FOR %c IN ("%~nb") DO @IF "%~xc" neq "" ECHO REN "%a" "%~nxc"

注意:qazxswwies用于测试的重命名命令。在测试执行重命名后删除echo关键字。

我使用echo作为测试目录。

翻译:对于子树中的每个文件名(u:\sourcedir)仅取名称部分并分配给%%a,重复%%b,如果结果中没有扩展部分,则执行重命名。


2
投票

将它从PHP翻译成PowerShell应该是轻而易举的,让我们试一试:

%%c

如上图所示:

  • PowerShell没有$files = Get-ChildItem -Filter *.dat.*.dat foreach($file in $files){ $filename = $file.Name $explodename = $filename.Split('.') $newfilename = "$($explodename[0]).$($explodename[3])" Rename-Item $file.FullName -NewName $newfilename } 函数,但我们可以在任何字符串上使用explode()方法并获取字符串数组
  • String.Split()不是PowerShell中的字符串连接运算符,但我们可以在可扩展字符串中使用子表达式.
  • $(...) cmdlet将负责重命名

一个更加PowerShell惯用的解决方案是利用管道:

Rename-Item

您还可以使用正则表达式模式代替Get-ChildItem -Filter *.dat.*.dat | Rename-Item -NewName {$explodename = $_.Name.Split('.');"$($explodename[0]).$($explodename[3])"} 方法和字符串连接:

Split()

或者使用Get-ChildItem -Filter *.dat.*.dat | Rename-Item -NewName {$_.Name -replace '^([^\.])\..*\..*\.([^\.])$','$1.$2'} 运算符进行连接:

-join

无论你喜欢什么,Get-ChildItem -Filter *.dat.*.dat | Rename-Item -NewName {$_.Name.Split('.')[0,3] -join '.'} Get-ChildItem绝对是你想要在这里使用的命令


0
投票

Rename-Item包含许多有用的指针,但似乎更简单和更健壮的方法是简单地删除最后的2个扩展,假设文件夹树中的所有文件都有这两个无关的扩展:

Mathias R. Jessen's answer
© www.soinside.com 2019 - 2024. All rights reserved.