多年来,我一直把我的所有电影都放到一个文件夹中,以及所有附加内容。 我已经意识到,经过几次挫折后,保留nfo和艺术的备份可以节省我的生命,并且在添加新的Kodi设置(电视,平板电脑,笔记本电脑等等)时保持数据库更加可用。 所以我试图根据电影的文件名批量创建一个文件夹,并将多个相关文件移动到创建的文件夹中。
要清楚,我想创建一个电影的文件夹名称,并让所有相关文件进入该文件夹。电影文件名'格式可以改变,因为他们都没有相同的信息,即导演剪辑,未编辑,终极版,这些都在brales []中。在所有情况下,主电影名称都是最小的文件名,我绝不希望文件夹的名称包含" [Extra]"在文件名中。 一般来说,格式是"电影(年)[额外信息] ... [额外信息]这里的小描述"对于非电影视频。
我提出的最好的是:
for %%i in (*) do md "%%~ni" && move "%%~i" "%%~ni"
现在的问题是我为每个文件创建一个文件夹,并将所有文件移动到相应的文件夹,但相关内容现在位于不同的文件夹中,文件名完全相同的内容将保留在主文件夹中
我想要完成的一个例子:
致:
任何人都可以帮我解决这个批处理代码吗?并非所有文件名都是电影(年份)[Comm] ...,有些只是电影或电影[Comm]。
总结:我想创建一个基于电影的文件夹,即任何具有特定视频扩展名的文件,例如mp4,mkv,avi等......也不包含:[Extra] ;然后将所有相关文件移动到该文件夹中。
我已经浏览了这些来源:
答案 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
之后,因为空格位于点之前。
因此,作为一种解决方法,也许您可以列出已知的扩展名列表'其中包含基本电影名称,然后移动与它们共享基本名称的所有文件。以下脚本就是这样做的。它会列出所有包含avi
,mp4
和mkv
扩展名的文件,但您可能必须从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的混合语法。