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

时间:2015-03-07 22:56:51

标签: windows batch-file cmd

多年来,我一直把我的所有电影都放到一个文件夹中,以及所有附加内容。 我已经意识到,经过几次挫折后,保留nfo和艺术的备份可以节省我的生命,并且在添加新的Kodi设置(电视,平板电脑,笔记本电脑等等)时保持数据库更加可用。 所以我试图根据电影的文件名批量创建一个文件夹,并将多个相关文件移动到创建的文件夹中。

要清楚,我想创建一个电影的文件夹名称,并让所有相关文件进入该文件夹。电影文件名'格式可以改变,因为他们都没有相同的信息,即导演剪辑,未编辑,终极版,这些都在brales []中。在所有情况下,主电影名称都是最小的文件名,我绝不希望文件夹的名称包含" [Extra]"在文件名中。 一般来说,格式是"电影(年)[额外信息] ... [额外信息]这里的小描述"对于非电影视频。

我提出的最好的是:

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

现在的问题是我为每个文件创建一个文件夹,并将所有文件移动到相应的文件夹,但相关内容现在位于不同的文件夹中,文件名完全相同的内容将保留在主文件夹中

我想要完成的一个例子:

  • \' 71 [Extra] 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 Women(1977)-poster.jpg
  • \ 3女性(1977).mp4
  • \ 3女性(1977).nfo
  • \ 12 Years A Slave(2013).mp4
  • \ 13(2010).mp4
  • \你的案例(2013).avi
  • \ A Single Shot(2013).mp4
  • \ Abre Los Ojos(1997)[睁开眼睛] [SPA] [额外] Test.mp4
  • \ Abre Los Ojos(1997)[Open Your Eyes] [SPA] .avi
  • \ Abre Los Ojos(1997)[Open Your Eyes] [SPA] .srt
  • \ G.B.F。 (2013)的.mp4
  • \ G.I。 Joe Retaliation(2013).mkv
  • \ G.I。 Joe Retaliation(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 Years A Slave(2013)\ 12 Years A Slave(2013).mp4
  • \ 13(2010)\ 13(2010).mp4
  • \你的案例(2013)\你的案例(2013).avi
  • \ A Single Shot(2013)\ A Single Shot(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
  • \ G.B.F。 (2013)\ G.B.F。 (2013)的.mp4
  • \ G.I。 Joe Retaliation(2013)\ G.I。 Joe Retaliation(2013).mkv
  • \ G.I。 Joe Retaliation(2013)\ G.I。 Joe Retaliation(2013).srt
  • \ Test Movie(1977)[Comm] \ Test Movie(1977)[Comm] .mp4

任何人都可以帮我解决这个批处理代码吗?并非所有文件名都是电影(年份)[Comm] ...,有些只是电影或电影[Comm]。

总结:我想创建一个基于电影的文件夹,即任何具有特定视频扩展名的文件,例如mp4,mkv,avi等......也不包含:[Extra] ;然后将所有相关文件移动到该文件夹​​中。

我已经浏览了这些来源:

  1. Batch create folders based on part of file name and move files into that folder
  2. Batch Created Folder By Filename Part and Move
  3. Batch create folders based on series of files and move to subdirectory
  4. Batch script to create folders based on filenames
  5. create folders based on a file name and move those files into that folder
  6. https://superuser.com/questions/762113/cmd-command-to-create-folder-for-each-file-and-move-file-into-folder
  7. Batch script that moves each file in a folder into their own folders named after the file?
  8. Batch command move png files to folders same name files and folders
  9. Batch command to check for partial filename then move
  10. Windows CMD命令行的A-Z索引:http://ss64.com/nt/

4 个答案:

答案 0 :(得分:8)

虽然您的描述充足,但您忘记提供一些具体细节;例如:使用"电影(年份)"启动所有文件名。部分?如果是这样,那么这个批处理文件可以执行您想要的操作:

编辑:操作,我误解了要求!此版本正常运行:

@echo off
setlocal

set "basename=."
for /F "tokens=1* delims=." %%a in ('dir /B /A-D ^| 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
   )
)

答案 1 :(得分:3)

只需在实际的源位置保存带有.Bat扩展名的以下代码,它就可以了。

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

答案 2 :(得分:1)

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

因此,作为一种解决方法,也许您可​​以列出已知的扩展名列表'其中包含基本电影名称,然后移动与它们共享基本名称的所有文件。以下脚本就是这样做的。它会列出所有包含avimp4mkv扩展名的文件,但您可能必须从nfo开始,这可能适用于许多电影。该脚本使用这些文件的文件名来创建目录并查找相关文件。它似乎可以解决问题,但请在使用之前进行备份。 :)

此脚本中的假设是具有已知扩展名的文件也具有最短名称。如果有其他文件名称较短(或者不匹配),则不会将其移至该文件夹。

脚本并不完美。最大的缺点是如果一部电影包含多个mp4文件,它将为每个电影创建一个文件夹。 但是如果你做了几次迭代,每次都按照特定的顺序使用不同的扩展(从nfo和其他类似的扩展开始,然后继续移动电影二进制扩展等)你至少可以做到< em>大多数工作自动。

@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

答案 3 :(得分:0)

我认为这会有效,但首先尝试测试文件夹:

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

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