Seit Jahren hatte ich immer alle meine Filme in einem Ordner gespeichert, zusammen mit all ihren Extras ... Ich habe jetzt nach mehreren Frustrationen festgestellt, dass eine Sicherung von NFO und Kunst mir Leben retten würde, und das zu behalten Datenbank ist beim Hinzufügen eines neuen Kodi-Setups (TV, Tablet, Laptop usw.) besser zu verwenden. Daher versuche ich, einen Ordner zu erstellen, der auf dem Dateinamen des Films basiert, und mehrere verwandte Dateien in das Verzeichnis zu verschieben Ordner erstellt.
Um klar zu sein, möchte ich einen Ordnernamen für den Film festlegen und alle zugehörigen Dateien in diesen Ordner aufnehmen. Das Format der Filmdateinamen kann sich ändern, da sie nicht alle die gleichen Informationen haben, d. H. Director's Cut, Unedit, Ultimate Edition, die in Brakets [] stehen. Der Name des Hauptfilms wäre in jedem Fall der kleinste Dateiname, und ich möchte nie, dass der Ordner mit einer Datei benannt wird, die "[Extra]" im Dateinamen enthielt. Im Allgemeinen ist das Format "Movie (Jahr)" ) [extra info] ... [extra info] kleine Beschreibung hier "für die Nichtfilmvideos.
Das Beste was ich mir ausgedacht habe ist:
for %%i in (*) do md "%%~ni" && move "%%~i" "%%~ni"
Das Problem im Moment ist, dass ich für jede Datei einen Ordner erstelle und alle Dateien in die entsprechenden Ordner verschiebe. Der zugehörige Inhalt befindet sich jedoch in verschiedenen Ordnern. Elemente mit genau demselben Dateinamen werden im Hauptordner angezeigt.
Ein Beispiel für das, was ich erreichen möchte:
Zu:
Kann mir jemand mit diesem Batch-Code helfen? Nicht alle Dateinamen sind Movie (Year) [Comm] ..., einige sind nur Movie oder Movie [Comm].
Zusammenfassend: Ich möchte einen Ordner erstellen, der auf einem Film basiert, dh jede Datei mit einer bestimmten Videoerweiterung wie mp4, mkv, avi usw., die auch nicht enthält: [Extra]; Verschieben Sie dann alle zugehörigen Dateien in diesen Ordner.
Ich habe diese Quellen durchgegangen:
Obwohl Ihre Beschreibung ausreichend ist, haben Sie einige Details vergessen. Zum Beispiel: startet alle Dateinamen mit dem Teil "Film (Jahr)"? Wenn ja, dann machen Sie diese Batch-Datei, was Sie wollen:
EDIT: Ops, ich habe die Anforderungen falsch verstanden! Diese Version funktioniert korrekt:
@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
)
)
Speichern Sie einfach den folgenden Code mit der Erweiterung .Bat am tatsächlichen Quellspeicherort, und der Trick wird ausgeführt.
@echo off
for %%a in (*.*) do (
md "%%~na" 2>nul
move "%%a" "%%~na"
)
pause
Dies ist nicht einfach, da Sie die Dateinamen sortieren müssen. Sie können mit dir
eine Sortierreihenfolge angeben, aber es werden nicht die kürzesten Namen zuerst angezeigt. Zum Beispiel steht foo.wmv
alphabetisch hinter foo subtitles.srt
, da Leerzeichen vor Punkt stehen.
Um dieses Problem zu umgehen, könnten Sie möglicherweise eine Liste mit bekannten Erweiterungen haben, die die grundlegenden Filmnamen enthalten, und dann alle Dateien verschieben, die den Basisnamen gemeinsam verwenden. Das folgende Skript macht genau das. Es listet alle Dateien mit den Erweiterungen avi
, mp4
und mkv
auf. Möglicherweise müssen Sie jedoch mit nfo
beginnen, das für viele Filme verfügbar ist. Das Skript verwendet die Dateinamen dieser Dateien, um Verzeichnisse zu erstellen und verwandte Dateien zu suchen. Es scheint den Trick zu tun, aber machen Sie eine Sicherungskopie, bevor Sie es verwenden. :)
In diesem Skript wird davon ausgegangen, dass die Datei mit der bekannten Erweiterung auch den kürzesten Namen hat. Wenn andere Dateien kürzere Namen haben (oder auf andere Weise nicht übereinstimmen), werden sie nicht in diesen Ordner verschoben.
Das Skript ist nicht perfekt. Der größte Nachteil besteht darin, dass ein Film, der mehrere mp4-Dateien enthält, für jeden einen Ordner erstellt. Wenn Sie jedoch ein paar Iterationen durchführen und jedes Mal verschiedene Erweiterungen in einer bestimmten Reihenfolge verwenden (beginnen Sie mit nfo
und anderen ähnlichen Erweiterungen, bewegen Sie dann die binären Filmerweiterungen usw.), können Sie möglicherweise mindestens meistens der Arbeit automatisch.
@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
Ich denke, dass dies funktionieren wird, aber probieren Sie zuerst einen Testordner:
@echo off
for %%a in (*.*) do (
md "%%~na" 2>nul
move "%%a" "%%~na"
)
cd ..
del %%~na
pause
edit: Ich habe den Code geändert, die Batch- und Bash-Syntax gemischt.