Comando CMD para crear una carpeta para cada archivo y mover el archivo a la carpeta

10

Necesito un comando que se pueda ejecutar desde la línea de comandos para crear una carpeta para cada archivo (según el nombre del archivo) en un directorio y luego mover el archivo a las carpetas recién creadas.

Ejemplo:

Carpeta de inicio:

Dog.jpg
Cat.jpg

El siguiente comando funciona muy bien para crear una carpeta para cada nombre de archivo en el directorio de trabajo actual.

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

Carpeta de resultados:

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

Necesito ir un paso más allá y mover el archivo a la carpeta.

Lo que quiero lograr es:

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

¿Alguien puede ayudarme con un comando para hacer todo esto?

Tom
fuente

Respuestas:

10

El segundo comando sería

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

EDITAR: Se agregó "" para% i, según el comentario de and31415. tnx.

LPChip
fuente
44
Siguiendo con eso, diría que A) podría combinarlos- for %i in (*) do cmda && cmdb B) podría hacer eco primero for %i in (*) do @ECHO cmda && cmdb C) podría agregar Creo que es un / R pasar por subdirectorios.
barlop
2
Este comando no funcionará cuando los nombres de archivo contengan espacios. Debería usar algo como esto: for %i in (*) do move "%~i" "%~ni"incluso eso podría no ser lo suficientemente bueno, ya que puede tener efectos secundarios cuando la carpeta de destino no existe (por ejemplo, los archivos se "mueven" sobre sí mismos, por lo tanto, se les cambia el nombre). Una solución fácil sería combinar ambos comandos, de esta manera: for %i in (*) do md "%~ni" && move "%~i" "%~ni"el comando supone que los directorios ya no existen.
y31415
2
Además, para ampliar el comentario de barlop, cuando se utiliza cmda && cmdba continuación, cmdbse ejecutará sólo si cmdase ha realizado correctamente. Si fuera a usarlo cmda & cmdb, el segundo comando se ejecutaría independientemente. De hecho, un único ampersand ( &) es solo un separador de comandos y el doble ampersand ( &&) es condicional . Los comandos que no establecen un errorlevelvalor no deben usarse con este último.
y31415
5

Simplemente ejecute estos comandos en serie:

Para crear las carpetas para cada archivo:

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

Para mover cada archivo a su carpeta:

for %i in (*) do move "%i" "%~ni"
Yusuph wickama
fuente
1
¡Bienvenido a Super User! Esto duplica otra respuesta y no agrega contenido nuevo. No publique una respuesta a menos que realmente tenga algo nuevo que aportar.
DavidPostill
-1

Esto lo hará si tiene algunas carpetas como: ejemplo years \ Filename.mp4

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

enumerará todos los archivos de carpeta de primer nivel; enumera todos * .mp4 y * .mkv creará las carpetas de 2 niveles con el nombre de archivo y moverá todos los mismos archivos de nombre en la carpeta de primer nivel a la carpeta de segundo nivel, ejecútelo en la carpeta base de años.

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

Si no tiene una carpeta AÑOS de primer nivel, puede omitir el primero y ejecutar el segundo paso, ejecútelo en la carpeta base de nombre de archivo.

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

El && se asegurará de que el mkdir% ERRORLEVEL% anterior sea 0 para ejecutar el movimiento de los archivos

Para probar, use esto:

for /d %D in (*) do for %i in (%~fD\*.mp4,%~fD\*.mkv) do echo "%~dpi%~ni" && echo "%~dpi%~ni.*" "%~dpi%~ni\"
Olívio Moura
fuente
Buscar archivos a la izquierda: para / d% D en (*) hacer para% i en (% ~ fD \ *) hacer eco "% ~ dpi% ~ fi"
Olívio Moura
para / d% D en (*) hacer para% i en (% ~ fD \ *) mover "% ~ fi" "D: \ TRASH \"
Olívio Moura