将文件名复制到具有相同编号的文件

Copy filename to file with same number

所以描述起来有点模糊,所以我将使用图片:

我有大约 150 个与 SVG 具有相同内容的 DWG 文件(它们都是 1 对 1 转换的矢量绘图格式)。我想将 DWG 中的相同文件名应用到以相同数字开头的 SVG。

所以我最终得到:

001_TERMINAL.dwg
001_TERMINAL.svg
002_DIFFUSER.dwg
002_DIFFUSER.svg

等等...

我正在使用 Windows10.

的 PC

我怎样才能解决我的问题? 谢谢!

使用bash:

#!/bin/bash
for f in *.dwg; do
    IFS='_' read -r -a arr <<< "$f"
    mv ${arr[0]}.svg ${f%.*}.svg
done

假设 *.svg 文件名中总是 3 位数字:

set DIR=C:\mydir

@rem Allow repeated setting of !variables! in the FOR loop below
setlocal enabledelayedexpansion

for %%I in (%DIR%\*.dwg) do (
  @rem "~n" to pick out just the filename part of the %%I variable
  set BASENAME=%%~nI

  @rem Substring - batch file style
  set PREFIX=!BASENAME:~0,3!

  echo !PREFIX! ... !BASENAME!
  rename !PREFIX!.svg !BASENAME!.svg
)

请注意,这需要在批处理文件中才能使 %%I 正常工作。

主要的复杂问题是在多行 FOR 循环中使用变量。

对于这些,您必须使用延迟扩展选项,以使变量每次都被扩展,而不是在解析行时。这意味着您必须在批处理文件中使用 !variable! 而不是更正常的 %variable%

因为您使用的是 Windows,PowerShell 是解决此问题的理想选择。

对于下面的脚本,下划线字符前面的数字部分的长度无关紧要,只要 .dwg 文件名中有下划线,如您的问题所示。

只需将下面的 'c:\folder' 替换为您的文件存储路径。

$folderPath = "c:\folder" 

$files = Get-ChildItem ([System.IO.Path]::Combine($folderPath, "?*_*.dwg"))

for ($i=0; $i -lt $files.Count; $i++) 
{
    $file = $files[$i]    
    $dwgFileName = $file.BaseName
    $index = $dwgFileName.IndexOf("_")    
    $numberPart = $dwgFileName.Substring(0, $index)
    $svgFilePath = [System.IO.Path]::Combine($folderPath, "$numberPart.svg")

    if ([System.IO.File]::Exists($svgFilePath))
    {
        Rename-Item -Path $svgFilePath -NewName "$dwgFileName.svg"
    }
}