将文件名复制到具有相同编号的文件
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"
}
}
所以描述起来有点模糊,所以我将使用图片:
我有大约 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"
}
}