webentwicklung-frage-antwort-db.com.de

Batch Erstellen Sie einen Ordner basierend auf dem Dateinamen und verschieben Sie mehrere verknüpfte Dateien in den erstellten Ordner

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:

  • \ '71 [Extra] sup stuff.mp4
  • \ '71 .mkv
  • \ 3 Geezer! (2013) -fanart.jpg
  • \ 3 Geezer! (2013) -poster.jpg
  • \ 3 Geezer! (2013) .mp4
  • \ 3 Geezer! (2013) .nfo
  • 3 Frauen (1977) -fanart.jpg
  • 3 Frauen (1977) -poster.jpg
  • 3 Frauen (1977) .mp4
  • 3 Frauen (1977) .nfo
  • 12 Jahre ein Sklave (2013) .mp4
  • \ 13 (2010) .mp4
  • \ Ein Fall von dir (2013) .avi
  • \ A Single Shot (2013) .mp4
  • \ Abre Los Ojos (1997) [Öffne deine Augen] [SPA] [Extra] Test.mp4
  • \ Abre Los Ojos (1997) [Öffnen Sie Ihre Augen] [SPA] .avi
  • \ Abre Los Ojos (1997) [Öffnen Sie Ihre Augen] [SPA] .srt
  • \ G.B.F. (2013) .mp4
  • \ G.I. Joe Vergeltung (2013) .mkv
  • \ G.I. Joe Vergeltung (2013) .srt
  • \ Test Movie (1977) [Comm] .mp4

Zu: 

  • \ '71\'71 [Extra] sup stuff.mp4
  • \ '71\'71 .mkv
  • \ 3 Geezer! (2013)\3 Geezers! (2013) -fanart.jpg
  • \ 3 Geezer! (2013)\3 Geezers! (2013) -poster.jpg
  • \ 3 Geezer! (2013)\3 Geezers! (2013) .mp4
  • \ 3 Geezer! (2013)\3 Geezers! (2013) .nfo
  • 3 Frauen (1977) 3 Frauen (1977) -fanart.jpg
  • 3 Frauen (1977) 3 Frauen (1977) -poster.jpg
  • \ 3 Frauen (1977)\3 Frauen (1977) .mp4
  • \ 3 Women (1977)\3 Women (1977) .nfo
  • \ 12 Jahre A Slave (2013)\12 Jahre A Slave (2013) .mp4
  • 13 (2010) 13 (2010) .mp4
  • \ Ein Fall von Ihnen (2013)\Ein Fall von Ihnen (2013) .avi
  • \ A Single Shot (2013)\A Single Shot (2013) .mp4
  • \ Abre Los Ojos (1997) [Öffne deine Augen] [SPA]\Abre Los Ojos (1997) [Öffne deine Augen] [SPA] [Extra] Test.mp4
  • \ Abre Los Ojos (1997) [Öffne deine Augen] [SPA]\Abre Los Ojos (1997) [Öffne deine Augen] [SPA] .avi
  • \ Abre Los Ojos (1997) [Öffne deine Augen] [SPA]\Abre Los Ojos (1997) [Öffne deine Augen] [SPA] .srt
  • \ G.B.F. (2013)\G.B.F. (2013) .mp4
  • \ G.I. Joe Vergeltung (2013)\G.I. Joe Vergeltung (2013) .mkv
  • \ G.I. Joe Vergeltung (2013)\G.I. Joe Vergeltung (2013) .srt
  • \ Test Movie (1977) [Comm]\Test Movie (1977) [Comm] .mp4

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:

  1. Stapelerstellungsordner basierend auf einem Teil des Dateinamens und Verschieben von Dateien in diesen Ordner
  2. Stapel erstellter Ordner nach Dateiname und Verschieben
  3. Batch-Ordner basierend auf einer Reihe von Dateien erstellen und in das Unterverzeichnis verschieben
  4. Batch-Skript zum Erstellen von Ordnern basierend auf Dateinamen
  5. Ordner basierend auf einem Dateinamen erstellen und diese Dateien in diesen Ordner verschieben
  6. https://superuser.com/questions/762113/cmd-command-to-create-folder-for-each-file-and-move-file-into-folder
  7. Stapelskript, das jede Datei in einem Ordner in ihre eigenen Ordner verschiebt, die nach der Datei benannt sind?
  8. Stapelbefehl Verschiebe PNG-Dateien in Ordner mit gleichem Namen, Dateien und Ordner
  9. Stapelbefehl zur Prüfung auf einen partiellen Dateinamen und dann Verschieben
  10. Ein A-Z-Index der Windows CMD-Befehlszeile: http://ss64.com/nt/
9
ByteShare

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
   )
)
8
Aacini

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

2
Vinoth

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
1
GolezTrol

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.

0
Keethesh