Board logo

标题: [文本处理] 批处理多类型文件重命名的问题 [打印本页]

作者: duoduo200    时间: 2022-4-29 17:36     标题: 批处理多类型文件重命名的问题

[img][/img]

[img][/img]

各位大佬!
描述:在用everthing搜索文件的时候(如图一)基本都是序号+歌曲名。 所以想自动修改文件的命名。
        同样如图二为例,我目前文件夹的架构是: Z(祖文件夹)→歌手名字(父文件夹)→专辑名字(子文件夹)→音频文件+文本图片(孙文件夹)。
        同时文件分为三大类 :音频文件格式包括、WAV、flac、dts、dff、mp3)、文本文件(txt、pdf、word)、图片文件(jpg、png、jpeg);

需求:1、不删除原本音频文件的歌曲名字,音频文件可以自动命名为歌手+歌曲名。(注意,可以调用父文件夹来命名),如:01.张洪量-相思三态
         2、文本图片文件夹(孙文件夹)原有文件名字全部删除(无论图片还是文本),重命名为歌手名字+专辑名字。(注意,可以调用父文件夹名和子文件夹名),如:张洪量-1992-有种[滚石首版]


描述不清之处请见谅,感谢各位大佬!
作者: flashercs    时间: 2022-4-29 18:49

  1. @echo off
  2. if not exist "%~dp1" exit /b
  3. cd /d "%~dp1" 2>nul
  4. for %%A in ("%~f1\..") do (
  5.   set zhuanji=%%~nxA
  6.   for %%B in ("%%~fA\..") do (
  7.     set geshou=%%~nxB
  8.   )
  9. )
  10. @REM echo %zhuanji%
  11. @REM echo %geshou%
  12. @REM 重命名音频
  13. for %%A in (*.wav *.flac *.dts *.dff *.mp3) do (
  14.   for /f "tokens=1* delims=." %%B in ("%%~nxA") do (
  15.     ren "%%A" "%%B.%geshou%-%%C"
  16.   )
  17. )
  18. @REM 删除文本图片
  19. for /d %%A in (.\*) do (
  20.   pushd "%%A\"
  21.   del /q /f *.txt *.pdf *.doc *.jpg *.jpeg *.png
  22.   popd
  23.   ren "%%A" "%geshou%-%zhuanji%"
  24.   goto break
  25. )
  26. :break
  27. pause
  28. exit /b
复制代码

作者: zaqmlp    时间: 2022-4-29 19:42

  1. @echo off&(if "%~1" equ "" goto :end)
  2. if not exist "%~dp1" (echo;Path Error&goto :end) else (cd /d "%~dp1")
  3. for /f "delims=" %%a in ("%~dp1.") do set "fd1=%%~nxa"
  4. for /f "delims=" %%a in ("%~dp1..") do set "fd2=%%~nxa"
  5. for /f "delims=" %%a in ('dir /a-d-h/b *.wav *.flac *.dts *.dff *.mp3 2^>nul') do (
  6.     for /f "tokens=1* delims=." %%b in ("%%~na") do (
  7.         if "%%b" neq "" (
  8.             if "%%c" neq "" (
  9.                 echo;"%~dp1%%~nxa" --^> "%%b.%fd2%-%%c%%~xa"
  10.                 ren "%~dp1%%~nxa" "%%b.%fd2%-%%c%%~xa"
  11.             ) else (
  12.                 echo;"%~dp1%%~nxa" --^> "%fd2%-%%~nxa"
  13.                 ren "%~dp1%%~nxa" "%fd2%-%%~nxa"
  14.             )
  15.         )
  16.     )
  17. )
  18. for /d %%a in (*) do (
  19.     pushd "%%a"
  20.     for /f "delims=" %%b in ('dir /a-d-h/b *.txt *.pdf *.doc *.jpg *.jpeg *.png 2^>nul') do (
  21.         echo;"%~dp1%%~nxa%%~nxb" --^> "%fd2%-%fd1%%%~xb"
  22.         ren "%~dp1%%~nxa\%%~nxb" "%fd2%-%fd1%%%~xb"
  23.     )
  24.     popd
  25. )
  26. :end
  27. pause
  28. exit
复制代码

作者: duoduo200    时间: 2022-4-29 19:45

本帖最后由 duoduo200 于 2022-4-29 20:11 编辑

回复 2# flashercs
感谢大佬的回复。
可能我描述的不够清楚,或者需求太复杂。整体测试下来,出现了以下三种随机的情况:
[img][/img]
把祖文件夹的名字调用命名了,但命名变成在最后面了,但我想要达到的应该是  01.王珊珊-别让我一个人醉   这样的格式。(注,我的文件夹架构是  W文件夹--王珊珊文件夹--专辑名或者直接是文件--文件)
另外,就是不一定会有祖、父、子、孙的文件夹,比如上图就是文件直接在父文件夹里了,您的代码直接调用上级文件夹命名了。
所以,针对这个情况,是否能加个判断,如果掉用的文件夹名字是 大写字母的祖文件夹,就调用父文件夹的名字。这样是否能规避,文件也许在父文件夹或者子文件夹里的问题。或者您有其他建议更好。

[img][/img]
  这张是运行bat后,出现了只命名了子文件夹的文字(正常是不命名的),子文件夹下的文件没有被命名。

[img][/img]

这张是运行后,只出现了序列号,其他没有变化,包括孙文件夹《专辑图片与介绍》里的文件,也没有变化。

辛苦您再帮忙看看。
作者: duoduo200    时间: 2022-4-29 20:10

回复 3# zaqmlp

感谢大佬!
但有几个问题,还得麻烦您看一下。
[img][/img]

上面原文件夹和文件情况,下面是运行bat后命名的情况。
是否可以解决这个重复命名?

[img][/img]
[img][/img]
上面是原文件,下面是bat结果,这个正常了,但没有编号了。

另外,目前文件夹的架构是: 大写字母(祖文件夹)→歌手名字(父文件夹)→专辑名字(子文件夹)→音频文件+文本图片(孙文件夹)
也经过另一个大佬的代码,发现我自身文件夹里有个情况,就是文件有的是在父文件下,也有的是在子文件夹里。
所以是否可以加个判断,,如果调用的文件夹名字是 大写字母的祖文件夹,就调用父文件夹的名字。
不知道我阐述的是否清楚。请见谅。
作者: zaqmlp    时间: 2022-4-29 20:22

实际文件和文件夹都有什么情况,整理清楚在发出来,或者加我微信
作者: flashercs    时间: 2022-4-30 01:10

回复 4# duoduo200
  1. @echo off
  2. if not exist "%~dp1" exit /b
  3. cd /d "%~dp1" 2>nul
  4. for %%A in ("%~f1\..") do (
  5.   set zhuanji=%%~nxA
  6.   for %%B in ("%%~fA\..") do (
  7.     set geshou=%%~nxB
  8.   )
  9. )
  10. echo."%geshou%"|findstr /ric:"^\"[a-z]\"$" >nul && ( set "geshou=%zhuanji%" & set "zhuanji=")
  11. @REM echo zhuanji=%zhuanji%
  12. @REM echo geshou=%geshou%
  13. @REM 重命名音频
  14. for /f "tokens=1-2 delims=|" %%A in ('dir /a-d /b *.wav *.flac *.dts *.dff *.mp3^|powershell -c "begin{$ctr=0}process{$s=$($input);$s+'|'+(++$ctr).ToString().PadLeft(3,'0')+'.%geshou%-'+($s -replace ('^\d+\.('+[regex]::Escape('%geshou%-')+')*'),'')}"') do (
  15.     ren "%%A" "%%B"
  16. )
  17. @REM 重命名文本图片
  18. for /d %%A in (.\*) do (
  19.   pushd "%%A\"
  20.   for %%B in (*.txt *.pdf *.doc *.jpg *.jpeg *.png) do (
  21.     if defined zhuanji (
  22.       ren "%%B" "%geshou%-%zhuanji%%%~xB"
  23.     ) else (
  24.       ren "%%B" "%geshou%%%~xB"
  25.     )
  26.   )
  27.   popd
  28. )
  29. :break
  30. pause
  31. exit /b
复制代码

作者: duoduo200    时间: 2022-5-6 14:12

本帖最后由 duoduo200 于 2022-5-6 18:44 编辑

回复 7# flashercs


   感谢大佬!是我想要的效果。请您喝杯咖啡,已经打进您的支付宝里。

另外,有个小问题,麻烦您帮忙修改一下。专辑团片与介绍里有个别的.txt没有命名,我猜是因为都是txt和原名字相同的问题。由于所有该类文件夹的图片、文档数量有多有少,能否帮忙修改为全部都重命名,并添加序号(避免同名文件无法全部命名的问题)
参考格式  文档类:txt\pdf\word\ppt、  图片:jpg 、jpeg、gif、png、

另外,是否可以加个判断,就是在重命名时候,如果音频和图片文件现有的文件名和上两层文件夹里的 字和名字 重复就不用重命名了,不知道是否可以?

谢谢
作者: flashercs    时间: 2022-5-7 02:29

本帖最后由 flashercs 于 2022-5-7 14:13 编辑

回复 8# duoduo200
  1. @echo off
  2. if not exist "%~dp1" exit /b
  3. cd /d "%~dp1" 2>nul
  4. for %%A in ("%~f1\..") do (
  5.   set zhuanji=%%~nxA
  6.   for %%B in ("%%~fA\..") do (
  7.     set geshou=%%~nxB
  8.   )
  9. )
  10. echo."%geshou%"|findstr /ric:"^\"[a-z]\"$" >nul && ( set "geshou=%zhuanji%" & set "zhuanji=")
  11. @REM echo zhuanji="%zhuanji%"
  12. @REM echo geshou="%geshou%"
  13. @REM 重命名音频
  14. @REM for %%G in ("%geshou%") do (
  15. @REM   for %%Z in ("%zhuanji%") do (
  16. @REM   )
  17. @REM )
  18. for /f "tokens=1-2 delims=|" %%A in ('dir /a-d /b *.wav *.flac *.dts *.dff *.mp3^|2^>nul powershell -c "begin{$ctr=0;$g=$env:geshou;$z=$env:zhuanji}process{$s=$($input);$bn=[system.io.path]::GetFileNameWithoutExtension($s);if($bn -eq $g -or $bn -eq $z){return}$s+'|'+(++$ctr).ToString().PadLeft(3,'0')+\".$g-\"+($s -replace ('^(\d+\.)?('+[regex]::Escape(\"$g\")+'\s*-\s*)*'),'')}"') do (
  19.     ren "%%A" "%%B"
  20. )
  21. @REM 重命名文本图片
  22. for /d %%A in (.\*) do (
  23.   pushd "%%A\"
  24.   for /f "delims=" %%B in ('dir /a-d /b *.txt *.pdf *.doc *.ppt *.jpg *.jpeg *.png *.gif') do (
  25.     if defined zhuanji (
  26.       call :myren "%%~nxB" "%geshou%" "%zhuanji%"
  27.     ) else (
  28.       call :myren "%%~nxB" "%geshou%"
  29.     )
  30.   )
  31.   popd
  32. )
  33. pause
  34. exit /b
  35. :myren srcname geshou zhuanji
  36. setlocal
  37. @REM 忽略文件名basename与歌手或专辑目录名相同的文件
  38. if /i "%~n1"=="%~2" goto end
  39. if /i "%~n1"=="%~3" goto end
  40. if "%~3"=="" (
  41.   set "basename=%~2"
  42. ) else (
  43.   set "basename=%~2-%~3"
  44. )
  45. set "newname=%basename%%~x1"
  46. set n=1000
  47. :loop
  48. if /i "%newname%"=="%~1" goto end
  49. if not exist "%newname%" (
  50.   ren "%~1" "%newname%"
  51.   goto end
  52. )
  53. set /a n+=1
  54. set "newname=%basename%_%n:~-3%%~x1"
  55. goto loop
  56. :end
  57. endlocal
  58. exit /b
复制代码

作者: duoduo200    时间: 2022-5-7 08:51

回复 9# flashercs


    [img][/img]

大佬,最新的代码会有以上图片里的情况。
原有文件是 陈雷-丑丑啊思相枝   ,运行bat后变成了图片里的情况。我猜是不是 C--陈雷--音频文件,这样的架构有关。因为有的是 C---陈雷--专辑名称文件夹---音频文件  这样的架构。代码无法自动识别到底是几层架构。
所以是否能自动识别几层架构   或者   识别到音频文件有歌手名字和文件夹名字重复  就不再添加重复字样了。
作者: flashercs    时间: 2022-5-7 14:25

回复 10# duoduo200


    9楼 已修改
作者: duoduo200    时间: 2022-5-7 14:32

回复 11# flashercs


    感谢大佬的帮助




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2