web-dev-qa-db-fra.com

Créer par lots un dossier basé sur le nom du fichier et déplacer plusieurs fichiers associés vers le dossier créé

Pendant des années, tous mes films ont toujours été placés dans un même dossier, avec tous leurs extras . Je réalise maintenant qu'après plusieurs frustrations, conserver une copie de sauvegarde de nfo et d'art m'épargnerait des heures de vie et base de données plus utilisable lors de l’ajout d’une nouvelle configuration Kodi (TV, tablette, ordinateur portable, etc ...) . Je tente donc de créer par lots un dossier basé sur le nom du fichier du film et de déplacer plusieurs fichiers liés vers le même fichier. dossier créé.

Pour être clair, je veux créer un nom de dossier pour le film et que tous les fichiers associés soient placés dans ce dossier. Le format des noms de fichiers de film peut changer car ils n’ont pas tous la même information, c’est-à-dire l’édition finale, l’édition ultime, de Director, qui sont en brakets []. Le nom principal du film serait dans tous les cas le nom de fichier le plus petit, et je ne voudrais jamais que le dossier soit nommé avec un fichier contenant "[Extra]" dans le nom du fichier . En règle générale, le format est "Film (année)". ) [extra info] ... [extra info] petite description ici "pour les vidéos non-film.

Le meilleur que j'ai trouvé est: 

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

Le problème actuel est que je crée un dossier pour chaque fichier et que je déplace tous les fichiers dans les dossiers respectifs, mais le contenu associé se trouve maintenant dans différents dossiers et les objets portant exactement le même nom de fichier sont laissés dans le dossier principal.

Un exemple de ce que j'essaie d'accomplir:

  • \ '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 femmes (1977) -fanart.jpg
  • \ 3 femmes (1977) -poster.jpg
  • \ 3 femmes (1977) .mp4
  • \ 3 femmes (1977) .nfo
  • \ 12 ans un esclave (2013) .mp4
  • \ 13 (2010) .mp4
  • \ Une affaire de toi (2013) .avi
  • \ Un seul coup (2013) .mp4
  • \ Abre Los Ojos (1997) [Ouvrez les yeux] [SPA] [Extra] Test.mp4
  • \ Abre Los Ojos (1997) [Ouvrez les yeux] [SPA] .avi
  • \ Abre Los Ojos (1997) [Ouvrez les yeux] [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 femmes (1977)\3 femmes (1977) -fanart.jpg
  • \ 3 femmes (1977)\3 femmes (1977) -poster.jpg
  • \ 3 femmes (1977)\3 femmes (1977) .mp4
  • \ 3 femmes (1977)\3 femmes (1977) .nfo
  • \ 12 ans un esclave (2013)\12 ans un esclave (2013) .mp4
  • \ 13 (2010)\13 (2010) .mp4
  • \ Une affaire de toi (2013)\Une affaire de toi (2013) .avi
  • \ Un seul coup (2013)\Un seul coup (2013) .mp4
  • \ Abre Los Ojos (1997) [Ouvrez vos yeux] [SPA]\Abre Los Ojos (1997) [Ouvrez vos yeux] [SPA] [Extra] Test.mp4
  • \ Abre Los Ojos (1997) [Ouvrez vos yeux] [SPA]\Abre Los Ojos (1997) [Ouvrez vos yeux] [SPA] .avi
  • \ Abre Los Ojos (1997) [Ouvrez vos yeux] [SPA]\Abre Los Ojos (1997) [Ouvrez vos yeux] [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

Quelqu'un peut-il m'aider avec ce code de lot? Tous les noms de fichiers ne sont pas Movie (Year) [Comm] ..., certains ne sont que Movie ou Movie [Comm].

En résumé: je veux créer un dossier basé sur un film, c’est-à-dire tout fichier avec une extension vidéo spécifique, tel que mp4, mkv, avi, etc ... qui ne contient pas non plus: [Extra]; puis déplacez tous les fichiers associés dans ce dossier.

J'ai parcouru ces sources:

  1. Créez par lots des dossiers en fonction d'une partie du nom de fichier et déplacez les fichiers dans ce dossier
  2. Dossier créé par lot par nom de fichier et déplacement
  3. Batch crée des dossiers en fonction de séries de fichiers et passe au sous-répertoire
  4. Script batch pour créer des dossiers basés sur des noms de fichiers
  5. crée des dossiers basés sur un nom de fichier et déplace ces fichiers dans ce dossier
  6. https://superuser.com/questions/762113/cmd-command-cro-create-folder-for-each-file-and-move-file-into-folder
  7. Script de lot qui déplace chaque fichier dans un dossier dans leurs propres dossiers nommés d'après le fichier?
  8. La commande batch déplace les fichiers png dans des dossiers avec le même nom fichiers et dossiers
  9. Commande par lot pour vérifier le nom de fichier partiel, puis déplacer
  10. Index AZ de la ligne de commande Windows CMD: http://ss64.com/nt/
9
ByteShare

Bien que votre description soit ample, vous avez oublié de donner quelques détails spécifiques; Par exemple: démarre tous les noms de fichiers avec la partie "Film (année)"? Si oui, alors ce fichier batch fait ce que vous voulez:

EDIT: Ops, j'ai mal interprété les exigences! Cette version fonctionne correctement:

@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

Il suffit de sauvegarder le code ci-dessous avec l’extension .Bat dans l’emplacement réel de la source.

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

2
Vinoth

Ce n'est pas facile à faire, car il faudrait trier les noms de fichiers. Vous pouvez spécifier un ordre de tri en utilisant dir, mais les noms les plus courts ne seront pas les premiers. Par exemple, foo.wmv est alphabétiquement derrière foo subtitles.srt, car l'espace vient avant le point.

Donc, pour contourner le problème, vous pourriez peut-être avoir une liste des «extensions connues» contenant les noms de base des films, puis déplacer tous les fichiers qui partagent le nom de base avec eux. C'est ce que fait le script suivant. Il répertorie tous les fichiers avec les extensions avi, mp4 et mkv, mais vous devrez peut-être commencer par nfo, qui est disponible pour de nombreux films. Le script utilise les noms de fichiers de ces fichiers pour créer des répertoires et rechercher les fichiers associés. cela semble faire l'affaire, mais faites une sauvegarde avant de l'utiliser. :)

L'hypothèse de ce script est que le fichier avec l'extension connue porte également le nom le plus court. Si d’autres fichiers portent des noms plus courts (ou ne correspondent pas), ils ne seront pas déplacés vers ce dossier.

Le script n'est pas parfait. Le plus gros inconvénient est que si un film contient plusieurs fichiers mp4, il créera un dossier pour chacun d'entre eux. Mais si vous faites quelques itérations, en utilisant chaque fois différentes extensions dans un ordre spécifique (commencez par nfo et d’autres extensions similaires, puis déplacez les extensions binaires du film, etc.), vous pourrez peut-être faire au moins most du travail automatiquement.

@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

Je pense que cela fonctionnera, mais essayez d’abord un dossier de test:

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

edit: J'ai changé le code, la syntaxe mixte de batch et bash.

0
Keethesh