Commande CMD pour créer un dossier pour chaque fichier et déplacer le fichier dans un dossier

10

J'ai besoin d'une commande qui peut être exécutée à partir de la ligne de commande pour créer un dossier pour chaque fichier (basé sur le nom de fichier) dans un répertoire, puis déplacer le fichier dans les dossiers nouvellement créés.

Exemple :

Dossier de démarrage:

Dog.jpg
Cat.jpg

La commande suivante fonctionne très bien pour créer un dossier pour chaque nom de fichier dans le répertoire de travail actuel.

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

Dossier de résultats:

\Dog\
\Cat\
Dog.jpg
Cat.jpg

Je dois aller plus loin et déplacer le fichier dans le dossier.

Ce que je veux réaliser, c'est:

\Dog\Dog.jpg
\Cat\Cat.jpg

Quelqu'un peut-il m'aider avec une seule commande pour faire tout cela?

À M
la source

Réponses:

10

La deuxième commande serait

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

EDIT: "" ajouté pour% i, basé sur le commentaire de and31415. tnx.

LPChip
la source
4
Suite à cela, je dirais que A) pourrait les combiner - for %i in (*) do cmda && cmdb B) pourrait faire écho en premier for %i in (*) do @ECHO cmda && cmdb C) pourrait ajouter Je pense que c'est un / R pour passer par les sous-répertoires.
barlop
2
Cette commande ne fonctionnera pas lorsque les noms de fichiers contiennent des espaces. Vous devriez utiliser quelque chose comme ceci: for %i in (*) do move "%~i" "%~ni"Même cela pourrait ne pas être suffisant, car cela peut avoir des effets secondaires lorsque le dossier cible n'existe pas (par exemple, les fichiers étant "déplacés" sur eux-mêmes, donc renommés). Une solution simple serait de combiner les deux commandes, comme ceci: for %i in (*) do md "%~ni" && move "%~i" "%~ni"La commande suppose que les répertoires n'existent pas déjà.
and31415
2
De plus, pour développer le commentaire de barlop, lorsque vous l'utiliserez, cmda && cmdbil cmdbsera exécuté uniquement s'il cmdaa réussi. Si vous deviez utiliser à la cmda & cmdbplace, la deuxième commande serait exécutée malgré tout. En fait, une seule esperluette ( &) n'est qu'un séparateur de commandes et la double esperluette ( &&) est une conditionnelle . Les commandes qui ne définissent pas de errorlevelvaleur ne doivent pas être utilisées avec cette dernière.
and31415
5

Exécutez simplement ces commandes en série:

Pour créer les dossiers de chaque fichier:

for %i in (*) do mkdir "%~ni"

Pour déplacer chaque fichier dans son dossier:

for %i in (*) do move "%i" "%~ni"
Yusuph wickama
la source
1
Bienvenue sur Super User! Cela duplique une autre réponse et n'ajoute aucun nouveau contenu. Veuillez ne pas poster de réponse à moins que vous ayez réellement quelque chose de nouveau à apporter.
DavidPostill
-1

Cela le fera si vous avez des dossiers comme: exemple years \ Filename.mp4

1901\Filename.mp4 
1902\Filename.mp4
1903\Filename.mp4

il listera tous les fichiers de 1er niveau du dossier; répertorie tous * .mp4 et * .mkv créera les 2 dossiers de niveau avec le nom de fichier et déplacera tous les fichiers de même nom dans le dossier de 1er niveau vers le dossier de 2e niveau, exécutez-le dans le dossier de base des années.

for /d %D in (*) do for %i in (%~fD\*.mp4,%~fD\*.mkv) do mkdir "%~dpi%~ni" && move "%~dpi%~ni.*" "%~dpi%~ni\"

Si vous n'avez pas de dossier YEARS de premier niveau, vous pouvez simplement ignorer le premier et exécuter la 2e étape, exécutez-le dans le dossier de base du nom de fichier.

for %i in (*.mp4,*.mkv) do mkdir "%~dpi%~ni" && move "%~dpi%~ni.*" "%~dpi%~ni\"

Le && s'assurera que le mkdir% ERRORLEVEL% précédent est 0 pour exécuter le déplacement des fichiers

Pour tester, utilisez ceci:

for /d %D in (*) do for %i in (%~fD\*.mp4,%~fD\*.mkv) do echo "%~dpi%~ni" && echo "%~dpi%~ni.*" "%~dpi%~ni\"
Olívio Moura
la source
Trouver les fichiers restants: pour / d% D dans (*) faire pour% i dans (% ~ fD \ *) faire écho "% ~ dpi% ~ fi"
Olívio Moura
pour / d% D dans (*) faire pour% i dans (% ~ fD \ *) déplacer "% ~ fi" "D: \ TRASH \"
Olívio Moura