重命名文件时替换最后一个_

时间:2018-11-21 03:25:10

标签: batch-file

我要删除所有“ name.jpg”,然后在Windows中将“ name_.jpg”重命名为“ name.jpg”。 文件结构是这样的。

>upperFolder
  >p1
    >學生_二反田●雄.jpg
    >學生_二反田●雄_.jpg
    >學生_半田●男.jpg
    >學生_半田●男_.jpg
    >學生_潘●.jpg
    >學生_潘●_.jpg
    >...
  >...
  >p7
    >學生_石井節●.jpg
    >學生_石井節●_.jpg
    >學生_王裕●.jpg
    >學生_王裕●_.jpg
    >學生_●垣  勇.jpg
    >學生_●垣  勇_.jpg
  

删除p1 /学生_二反田●雄.jpg

     

重命名p1 /学生_二反田●雄_.jpg p1_学生-二反田●雄.jpg

最终结果如下。 p1_是为了防止重复文件名和-单独的学生姓名。

>upperFolder
  >p1_學生-二反田●雄.jpg
  >p1_學生-半田●男.jpg
  >p1_學生-潘●.jpg
  >...
  >p7_學生-石井節●.jpg
  >p7_學生-王裕●.jpg
  >p7_學生-●垣  勇.jpg

我如何用bat或php制作这个?

我尝试过

mkdir tmp

for /f "eol=: delims=" %%D in ('dir /b /s /ad *^|sort /r') do (
  pushd "%%D"
  for %%F in (*) do move "%%F" "..\%%~nxD_%%F" >nul
  popd
)

move *_.jpg tmp
del *.jpg
cd tmp 
move *.jpg .. 2>NUL

但不能删除最后一个'_'

2 个答案:

答案 0 :(得分:3)

CMD中没有不匹配字符的通配符,因此您可以临时更改名称以_结尾的文件的扩展名:

注意:记住,如果要从批处理文件运行,请记住从upperFolder运行以下代码片段,并将%g更改为%% g。

:: /r stands for recursive and ~n stands for (file)name
for /r %g in (*_.jpg) do ren %g "%~ng.jphg"

然后,您可以删除名称不以_结尾的文件:

del /s *.jpg

最后,重命名并移动名称以_结尾的文件。但是,您需要一些棘手的事情,那就是在文件名前面加上包含它的目录名,用-替换文件名的内部_,删除文件名的尾随_,然后将文件移至upperFolder:

:: so that the variable expansion inside for's works as expected
setlocal EnableDelayedExpansion
:: loop through all the directories and store the names in g
for /d %g in (*) do (
    for %h in ("%g\*_.jphg") do (
        set "newname=%~nh"
        :: remove trailing _
        set "newname=!newname:~0,-1!"
        :: replace ALL _ with -, assuming the filename only has one inner _
        set "newname=!newname:_=-!"
        :: prepend directory name and restore extension
        set "newname=%g_!newname!.jpg"
        :: rename and move to current directory
        move %h ".\!newname!"
    )
)

答案 1 :(得分:2)

类似的事情应该对您有用:

for %%a in (*.jpg) do del /y "%%~a" & ren "%%~na_%%~nx" "%%~nxa"

在这里:

  • 搜索所有jpg类型的文件
    • 删除找到的人
    • 然后将以_结尾的相同名称的文件重命名为原始文件的名称

有关for /?和类似内容的更多信息,请参见%%~na命令或this

请注意,除非您的系统OEM代码页支持汉字,否则它将无法正常工作。您可以通过发出命令UTF-8切换到CHCP 65001编码并将批处理文件另存为UTF-8 (no BOM)来解决此问题。有关更多信息,请参见this