以编程方式更改图像名称以匹配其路径

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