bash - 将 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 扩展名
解决方案
在 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 /?