首页 > 解决方案 > 将 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 循环来压缩目录中的所有文件/文件夹以在 bash 中拥有 zip。

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

我已经有了这个 bash,它可以在 .zip 之前从任何文件名中取出 .exe

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

前任:

file1_23434434.exe.zip 

变成了

file1_23434434.zip

如何将我的所有 zip 文件从 software1_serial-here-1234.zip 批量重命名为 software1.zip

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

标签: bashpowershellbatch-file

解决方案


在 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"

I外部FOR的循环变量保存了 ZIP 文件的完整文件名,带有文件扩展名,但没有文件路径,J内部 for 循环的循环变量只保存第一个下划线之前的文件名部分。J还删除了文件名开头的所有下划线。所以__SoftwareX__Y.zip改名为SoftwareX.zip.

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

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

推荐阅读