批量基于文件名创build文件夹,并将多个相关文件移动到创build的文件夹

多年来,我一直把所有的电影都放到一个文件夹中,以及所有他们的演员。 我已经意识到,现在经过几次挫折保留了nfo的备份,艺术将节省我几个小时的生活,并保持数据库更加可用,当添加一个新的科迪设置(电视,平板电脑,笔记本电脑等…)。 所以我试图批量创build一个基于电影文件名的文件夹,并将多个相关的文件移动到创build的文件夹。

要清楚,我想要制作电影的文件夹名称,并将所有相关文件放入该文件夹中。 电影文件名的格式可以改变,因为它们并不都具有相同的信息,即导演的剪辑,编辑,终极版本,这是在[]中。 主要的电影名称在任何情况下都是最小的文件名,我永远不会希望这个文件夹被命名为文件名中包含“[Extra]”的文件。 一般来说格式是“电影(年)[额外信息] … [额外信息]小描述在这里”为非电影video。

我想到的最好的是:

for %%i in (*) do md "%%~ni" && move "%%~i" "%%~ni" 

现在的问题是我为每个文件创build一个文件夹,并将所有的文件移动到各自的文件夹,但相关的内容现在在不同的文件夹,具有完全相同的文件名的东西是留在主文件夹。

我试图完成的一个例子:

  • '71 [额外] sup stuff.mp4
  • \ '71 .MKV
  • \ 3 Geezers! (2013)-fanart.jpg
  • \ 3 Geezers! (2013)-poster.jpg
  • \ 3 Geezers! (2013)。MP4
  • \ 3 Geezers! (2013)的.nfo
  • 3女性(1977)-fanart.jpg
  • \ 3女性(1977)-poster.jpg
  • 三女(1977).mp4
  • \ 3女性(1977).nfo
  • 12年奴隶(2013).mp4
  • \ 13(2010).mp4
  • \你的一个案例(2013).avi
  • \单杆(2013).mp4
  • \ Abre Los Ojos(1997)[Open Your Eyes] [SPA] [Extra] Test.mp4
  • Abre Los Ojos(1997)[Open Your Eyes] [SPA] .avi
  • \ Abre Los Ojos(1997)[Open Your Eyes] [SPA] .srt
  • GBF(2013).mp4
  • GI Joe报复(2013).mkv
  • GI Joe报复(2013).srt
  • \ Test Movie(1977)[Comm] .mp4

至:

  • '71 \ '71 [Extra] sup stuff.mp4
  • \ '71 \ '71 .MKV
  • \ 3 Geezers! (2013)\ 3 Geezers! (2013)-fanart.jpg
  • \ 3 Geezers! (2013)\ 3 Geezers! (2013)-poster.jpg
  • \ 3 Geezers! (2013)\ 3 Geezers! (2013)。MP4
  • \ 3 Geezers! (2013)\ 3 Geezers! (2013)的.nfo
  • \ 3女性(1977)\ 3女性(1977)-fanart.jpg
  • \ 3女性(1977)\ 3女性(1977)-poster.jpg
  • 3女(1977)3女(1977).mp4
  • 3女性(1977)3女性(1977).nfo
  • \ 12年奴隶(2013)\ 12年奴隶(2013).mp4
  • \ 13(2010)\ 13(2010).mp4
  • \你的一个案例(2013)\你的案例(2013).avi
  • \单杆(2013)\单杆(2013).mp4
  • \ Abre Los Ojos(1997)[Open Your Eyes] [SPA] \ Abre Los Ojos(1997)[Open Your Eyes] [SPA] [Extra] Test.mp4
  • \ Abre Los Ojos(1997)[Open Your Eyes] [SPA] \ Abre Los Ojos(1997)[Open Your Eyes] [SPA] .avi
  • \ Abre Los Ojos(1997)[Open Your Eyes] [SPA] \ Abre Los Ojos(1997)[Open Your Eyes] [SPA] .srt
  • GBF(2013)\ GBF(2013).mp4
  • \ GI乔报复(2013)\ GI乔报复(2013).mkv
  • GI Joe报复(2013)\ GI乔报复(2013).srt
  • \ Test Movie(1977)[Comm] \ Test Movie(1977)[Comm] .mp4

任何人都可以帮我用这个批处理代码? 不是所有的文件名称是电影(年)[通讯] …,有些只是电影,或电影[通讯]。

总结:我想创build一个基于电影的文件夹,也就是任何具有特定video扩展名的文件,如mp4,mkv,avi等…也不包含:[Extra]; 然后将所有关联的文件移动到该文件夹​​。

我已经通过这些来源:

  1. 批量创build基于部分文件名称的文件夹并将文件移动到该文件夹​​中
  2. 按文件名部分批量创build文件夹并移动
  3. 批量基于一系列文件创build文件夹并移至子目录
  4. 批处理脚本根据文件名创build文件夹
  5. 根据文件名创build文件夹并将这些文件移动到该文件夹​​中
  6. https://superuser.com/questions/762113/cmd-command-to-create-folder-for-each-file-and-move-file-into-folder
  7. 批处理脚本,将文件夹中的每个文件移动到文件夹后面的文件夹中?
  8. 批处理命令将png文件移动到文件夹相同的名称文件和文件夹
  9. 批量命令检查部分文件名然后移动
  10. Windows CMD命令行的AZ索引: http : //ss64.com/nt/

虽然你的描述很充足,但是你忘了提供一些具体的细节; 例如:用“电影(年)”部分启动所有文件名? 如果是这样,那么这个批处理文件做你想要的:

编辑 :Ops,我误读了要求! 此版本正常工作:

 @echo off setlocal set "basename=." for /F "tokens=1* delims=." %%a in ('dir /B /AD ^| sort /R') do ( set "filename=%%a" setlocal EnableDelayedExpansion for /F "delims=" %%c in ("!basename!") do if "!filename:%%c=!" equ "!filename!" ( set "basename=!filename!" md "!basename!" ) move "!filename!.%%b" "!basename!" for /F "delims=" %%c in ("!basename!") do ( endlocal set "basename=%%c ) ) 

这样做并不容易,因为你必须对文件名进行排序。 您可以使用dir指定排序顺序,但不会使用最短的名称。 例如foo.wmvfoo subtitles.srt后面是字母,因为空格在点之前。

所以作为一个解决方案,也许你可以有一个包含基本电影名称的“已知扩展名”列表,然后移动所有与它们共享基本名称的文件。 下面的脚本就是这样做的。 它列出所有带有avimp4mkv扩展名的文件,但也许你必须从nfo开始,这可能适用于许多电影。 该脚本使用这些文件的文件名来制作目录并查找相关文件。 它似乎是做的伎俩,但请在使用它之前做一个备份。 🙂

在这个脚本中的假设是,具有已知扩展名的文件也具有最短的名称。 如果有其他文件具有较短的名称(或不匹配),那么他们将不会被移动到该文件夹​​。

剧本不完美。 最大的缺点是,如果一个电影包含多个MP4文件,它将为每个文件创建一个文件夹。 但是,如果你做了几次迭代,每次使用不同的扩展按照特定的顺序(以nfo和其他类似的扩展开头,然后移动电影二进制扩展等),你可能至少能够自动完成大部分工作。

 @echo off setlocal REM store current directory. Using separate variable makes it REM easier to change behaviour too. set dir=%cd% REM call subroutine for each supported extension. call :do .info call :do .mp4 call :do .avi call :do .mkv REM Main program done. echo Press a key to close. pause exit /b :do set ext=%1 REM loop through all files with the given extension. for /f "tokens=*" %%f in ('dir /b /on "%dir%\*%ext%"') do ( REM trim the extension and use the base name as directory name. setlocal EnableDelayedExpansion set thefile=%%~nf echo !thefile! md "%dir%\!thefile!" REM move all files that start with the same base name. move "%dir%\!thefile!*.*" "%dir%\!thefile!\" ) REM exit subroutine exit /b 

只需在.Bat扩展名中保存下面的代码到实际的源代码中就可以了。

 @echo off for %%a in (*.*) do ( md "%%~na" 2>nul move "%%a" "%%~na" ) pause 

我认为这将工作,但首先尝试在测试文件夹:

 @echo off for %%a in (*.*) do ( md "%%~na" 2>nul move "%%a" "%%~na" ) cd .. del %%~na pause 

编辑:我改变了代码,批处理和bash的混合语法。