以编程方式更改图像名称以匹配其路径
Changing image names programmatically to match their paths
我有一个包含许多文件夹的目录。
Root Folder
>directory
>subdirectory
>img
image1.gif
>subdirectory2
>img
image1.gif
>directory2
>img
image1.gif
...
我希望每个图像都在其父文件夹前加上一个“_”分隔符 - 直到根文件夹,而不在 "img" 文件夹前加上。
因此,在我们的示例中,它将图像的名称更改为:
Root Folder
>directory
>subdirectory
>img
directory_subdirectory_image1.gif
>subdirectory2
>img
directory_subdirectory2_image1.gif
>directory2
>img
directory2_image1.gif
然后,如果可能的话,如果我能把所有的图片复制到一个重命名的文件夹中就更好了。
我试过使用重命名器,但它不起作用(不允许 if 语句所以不能跳过图像):
我正在尝试编写一个批处理脚本来完成此操作,但遇到了一些麻烦,特别是在 IF 和获取所有 directories/sub-directories.
方面
@echo off
pushd "Folder"
for /d %%D in (*) do (
pushd "%%D"
for /r %%F in (*) do (
for %%P in ("%%F\..") do (
ren "%%F" "%%~nxP_%%~nxF"
)
)
popd
)
popd
谁能帮我解决这个问题?
谢谢
PowerShell 答案。这不是对语言的有效使用,但我想展示一些易于阅读的东西。将 $rootPath
更改为问题中 Root Folder
所在的路径。
$rootPath = "f:\temp"
Get-ChildItem -Path $rootPath -Filter *.gif -Recurse | ForEach-Object{
$newnamePrefix = $_.DirectoryName -replace [regex]::escape("$rootPath\") -replace "\","_"
$newName = $newnamePrefix + "_" + $_.Name
Rename-Item $_.FullName -NewName $newName
}
此代码未经测试,因此请尝试复制您的数据。使用文件的目录名称构建一个 $newnamePrefix
,然后将其添加到当前名称。同样,这可以变得更加高效和简化,但它应该让您了解您可以做什么。
处理运动的较矮
这是上面发生的事情的简化版本,它会将所有文件移动到另一个目录并省略新名称的 img
部分
$rootPath = "f:\temp"
$newPath = "F:\newdirectory"
Get-ChildItem -Path $rootPath -Filter *.gif -Recurse |
Rename-Item -NewName {$_.FullName -replace "$([regex]::Escape("$RootPath"))\(.*?)\img(\.*?\.gif)", '' -replace "\","_"} -PassThru |
Move-Item -Destination $newPath
同样,这没有经过测试。
这里是这个任务的批处理解决方案:
@echo off
setlocal EnableDelayedExpansion
set "RootFolder=C:\Temp\Test\"
set "ListFile=%TEMP%\FilesList.tmp"
rem Get list of all files in all subdirectories.
dir /A-D /B /ON /S "%RootFolder%">"%ListFile%" 2>nul
if errorlevel 1 goto CleanUp
rem For each file in list file do the file rename.
for /F "usebackq delims=" %%F in ("%ListFile%") do call :RenameFile "%%F"
:CleanUp
del "%ListFile%"
goto :EOF
:RenameFile
rem The list file contains each file name with full path.
set "FileNameWithPath=%~1"
rem Get full path to file.
set "FilePath=%~dp1"
rem Remove the backslash at end of path.
set "FilePath=%FilePath:~0,-1%"
rem Get name of folder containing the file.
for /F "delims=" %%D in ("%FilePath%") do set "ImageFolder=%%~nD"
rem Remove the root folder path from file name with path.
set "NewFileName=!FileNameWithPath:%RootFolder%=!"
rem Remove the folder containing the file.
set "NewFileName=!NewFileName:\%ImageFolder%\=_!"
rem Replace all backslashes by underscores.
set "NewFileName=%NewFileName:\=_%"
rem Execute the file renaming operation.
ren "%FileNameWithPath%" "%NewFileName%"
goto :EOF
分配给顶部本地环境变量 RootFolder 的值必须适应您的根文件夹路径。末尾的反斜杠很重要,否则所有文件名在重命名操作后都将以下划线开头。
注:
如果包含图像文件的文件夹名称在路径中存在两次,结果将是错误的,即
directory\img\subdirectory\img\image1.gif
结果
directory_subdirectory_image1.gif
而不是
directory_img_subdirectory_image1.gif
我有一个包含许多文件夹的目录。
Root Folder
>directory
>subdirectory
>img
image1.gif
>subdirectory2
>img
image1.gif
>directory2
>img
image1.gif
...
我希望每个图像都在其父文件夹前加上一个“_”分隔符 - 直到根文件夹,而不在 "img" 文件夹前加上。
因此,在我们的示例中,它将图像的名称更改为:
Root Folder
>directory
>subdirectory
>img
directory_subdirectory_image1.gif
>subdirectory2
>img
directory_subdirectory2_image1.gif
>directory2
>img
directory2_image1.gif
然后,如果可能的话,如果我能把所有的图片复制到一个重命名的文件夹中就更好了。
我试过使用重命名器,但它不起作用(不允许 if 语句所以不能跳过图像):
我正在尝试编写一个批处理脚本来完成此操作,但遇到了一些麻烦,特别是在 IF 和获取所有 directories/sub-directories.
方面@echo off
pushd "Folder"
for /d %%D in (*) do (
pushd "%%D"
for /r %%F in (*) do (
for %%P in ("%%F\..") do (
ren "%%F" "%%~nxP_%%~nxF"
)
)
popd
)
popd
谁能帮我解决这个问题?
谢谢
PowerShell 答案。这不是对语言的有效使用,但我想展示一些易于阅读的东西。将 $rootPath
更改为问题中 Root Folder
所在的路径。
$rootPath = "f:\temp"
Get-ChildItem -Path $rootPath -Filter *.gif -Recurse | ForEach-Object{
$newnamePrefix = $_.DirectoryName -replace [regex]::escape("$rootPath\") -replace "\","_"
$newName = $newnamePrefix + "_" + $_.Name
Rename-Item $_.FullName -NewName $newName
}
此代码未经测试,因此请尝试复制您的数据。使用文件的目录名称构建一个 $newnamePrefix
,然后将其添加到当前名称。同样,这可以变得更加高效和简化,但它应该让您了解您可以做什么。
处理运动的较矮
这是上面发生的事情的简化版本,它会将所有文件移动到另一个目录并省略新名称的 img
部分
$rootPath = "f:\temp"
$newPath = "F:\newdirectory"
Get-ChildItem -Path $rootPath -Filter *.gif -Recurse |
Rename-Item -NewName {$_.FullName -replace "$([regex]::Escape("$RootPath"))\(.*?)\img(\.*?\.gif)", '' -replace "\","_"} -PassThru |
Move-Item -Destination $newPath
同样,这没有经过测试。
这里是这个任务的批处理解决方案:
@echo off
setlocal EnableDelayedExpansion
set "RootFolder=C:\Temp\Test\"
set "ListFile=%TEMP%\FilesList.tmp"
rem Get list of all files in all subdirectories.
dir /A-D /B /ON /S "%RootFolder%">"%ListFile%" 2>nul
if errorlevel 1 goto CleanUp
rem For each file in list file do the file rename.
for /F "usebackq delims=" %%F in ("%ListFile%") do call :RenameFile "%%F"
:CleanUp
del "%ListFile%"
goto :EOF
:RenameFile
rem The list file contains each file name with full path.
set "FileNameWithPath=%~1"
rem Get full path to file.
set "FilePath=%~dp1"
rem Remove the backslash at end of path.
set "FilePath=%FilePath:~0,-1%"
rem Get name of folder containing the file.
for /F "delims=" %%D in ("%FilePath%") do set "ImageFolder=%%~nD"
rem Remove the root folder path from file name with path.
set "NewFileName=!FileNameWithPath:%RootFolder%=!"
rem Remove the folder containing the file.
set "NewFileName=!NewFileName:\%ImageFolder%\=_!"
rem Replace all backslashes by underscores.
set "NewFileName=%NewFileName:\=_%"
rem Execute the file renaming operation.
ren "%FileNameWithPath%" "%NewFileName%"
goto :EOF
分配给顶部本地环境变量 RootFolder 的值必须适应您的根文件夹路径。末尾的反斜杠很重要,否则所有文件名在重命名操作后都将以下划线开头。
注:
如果包含图像文件的文件夹名称在路径中存在两次,结果将是错误的,即
directory\img\subdirectory\img\image1.gif
结果
directory_subdirectory_image1.gif
而不是
directory_img_subdirectory_image1.gif