Comando CMD per creare una cartella per ogni file e spostare il file nella cartella


10

Ho bisogno di un comando che può essere eseguito dalla riga di comando per creare una cartella per ciascun file (in base al nome del file) in una directory e quindi spostare il file nelle cartelle appena create.

Esempio :

Cartella iniziale:

Dog.jpg
Cat.jpg

Il seguente comando funziona perfettamente nella creazione di una cartella per ciascun nome file nella directory di lavoro corrente.

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

Cartella dei risultati:

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

Devo fare un ulteriore passo avanti e spostare il file nella cartella.

Quello che voglio ottenere è:

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

Qualcuno può aiutarmi con un comando per fare tutto questo?

Risposte:


10

Il secondo comando sarebbe

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

EDIT: Aggiunto "" per% i, basato sul commento di and31415. tnx.


4
A seguito di ciò direi che A) potrebbe combinarli, for %i in (*) do cmda && cmdb B) potrebbe fare eco prima for %i in (*) do @ECHO cmda && cmdb C) potrebbe aggiungere, penso che sia a / R passare attraverso i sottodir.
barlop

2
Questo comando non funzionerà quando i nomi dei file contengono spazi. Dovresti usare qualcosa del genere: for %i in (*) do move "%~i" "%~ni"anche questo potrebbe non essere abbastanza buono, in quanto può avere effetti collaterali quando la cartella di destinazione non esiste (ad esempio i file che vengono "spostati" su se stessi, quindi rinominati). Una soluzione semplice sarebbe quella di combinare entrambi i comandi, in questo modo: for %i in (*) do md "%~ni" && move "%~i" "%~ni"il comando presuppone che le directory non esistano già.
and31415

2
Inoltre, per espandere il commento di barlop, quando si utilizza cmda && cmdballora cmdbverrà eseguito solo se cmdaha avuto successo. Se invece dovessi usare cmda & cmdb, il secondo comando verrebbe eseguito indipendentemente. In effetti, una singola e commerciale ( &) è solo un separatore di comandi e la doppia e commerciale ( &&) è condizionale . I comandi che non impostano un errorlevelvalore non devono essere usati con quest'ultimo.
and31415

5

Esegui questi comandi in serie:

Per creare le cartelle per ciascun file:

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

Per spostare ciascun file nella sua cartella:

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

1
Benvenuto in Super User! Questo duplica un'altra risposta e non aggiunge nuovi contenuti. Per favore, non pubblicare una risposta a meno che tu non abbia effettivamente qualcosa di nuovo da contribuire.
DavidPostill

-1

Questo lo farà se hai delle cartelle come: esempio anni \ Nomefile.mp4

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

elencherà tutti i file di primo livello della cartella; elenca tutti * .mp4 e * .mkv creerà le cartelle di 2 livelli con il nome file e sposterà tutti gli stessi file di nome nella cartella di 1 ° livello nella cartella di 2o livello, eseguendoli nella cartella base anni.

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

Se non disponi di una cartella ANNI di 1 ° livello, puoi semplicemente ignorare il primo ed eseguire il secondo passaggio, eseguilo nella cartella base del nome file.

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

&& assicurerà che il precedente mkdir% ERRORLEVEL% sia 0 per eseguire lo spostamento dei file

Per testare, usa questo:

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

Trova i file a sinistra: per / d% D in (*) fare per% i in (% ~ fD \ *) echo "% ~ dpi% ~ fi"
Olívio Moura

per / d% D in (*) fare per% i in (% ~ fD \ *) spostare "% ~ fi" "D: \ TRASH \"
Olívio Moura
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.