将zip文件批量重命名为原始名称,但删除部分名称

时间:2019-01-16 10:35:02

标签: bash powershell batch-file

我的目录中有很多zip。

所有具有不同名称的软件,这些软件已随着时间的推移而获得。

例如:

Software1_ABCDE-FGHIJ.zip
Software2_256SS-BM42.zip
Software3_aswdfbbgtyyn.zip

我想使用批处理/ powershell或bash将它们全部重命名为

例如:

Software1.zip
Software2.zip
Software3.zip

基本上需要_之后和.zip之前的所有内容,但其所有内容都是随机的...基本上是串行密钥。名称对于我在服务器上制作的php下载器来说已经很长了,其他功能需要限制,因此我需要重命名100个zip。

我已经有了一个for循环,可以将dir中的所有文件/文件夹压缩为bash中自己的zip。

for i in */; do zip -r "${i%/}.zip" "$i"; done

并且我已经有了可以将.exe从.zip之前的任何文件名中删除的bash。

rename.ul '.exe' '' *.zip

例如:

file1_23434434.exe.zip 

成为

file1_23434434.zip

我如何批量重命名我的所有zip 从software1_serial-here-1234.zip到software1.zip

保留软件的原始zip名称和.zip扩展名

3 个答案:

答案 0 :(得分:1)

在Windows命令提示符窗口中,运行包含ZIP文件的目录:

for /F "tokens=1* delims=_ eol=" %I in ('dir *_*.zip /A-D-H /B 2^>nul') do ren "%I_%J" "%I.zip"

在包含ZIP文件的目录中存储的批处理文件中:

@for /F "tokens=1* delims=_ eol=" %%I in ('dir "%~dp0*_*.zip" /A-D-H /B 2^>nul') do ren "%~dp0%%I_%%J" "%%I.zip"

如果软件名称后有多个下划线而不是一个_,或者软件名称以一个或多个下划线开头,则必须使用两个 FOR 循环来重命名所有*_*.zip个文件正确:

@for /F "delims= eol=" %%I in ('dir "%~dp0*_*.zip" /A-D-H /B 2^>nul') do @for /F "delims=_ eol=" %%J in ("%%I") do ren "%~dp0%%I" "%%J.zip"
外部 FOR

循环变量I保留具有文件扩展名的ZIP文件的完整文件名,但没有文件路径,而内部for循环的循环变量J仅保留第一个下划线之前的文件名部分。 J也删除了文件名开头的所有下划线。因此__SoftwareX__Y.zip重命名为SoftwareX.zip

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • call /? ...说明%~dp0 ...驱动器和参数0的路径,该参数是始终以反斜杠结尾的批处理文件路径。
  • dir /?
  • for /?
  • ren /?

答案 1 :(得分:0)

由于您还用powershell标记了问题,因此这是PowerShell的处理方式:

Get-ChildItem -Filter *.zip | Rename-Item -NewName { $_.Name -replace "_.*", ".zip" }

使用类似批处理的别名的简短版本:

dir -filter *.zip | ren -new { $_.name -replace "_.*", ".zip" }

答案 2 :(得分:0)

Get-ChildItem -Path C:\temp -Filter software* -File | 
   Rename-Item -NewName { ($_.BaseName -split '_')[0] + $_.Extension } -WhatIf

删除-whatif以应用操作。 -whatif用于预览。

这假定您要重命名的所有文件都以“软件”一词​​开头,并且文件名中只有一个_。