CMD-Befehl zum Erstellen eines Ordners für jede Datei und zum Verschieben der Datei in einen Ordner

10

Ich benötige einen Befehl, der über die Befehlszeile ausgeführt werden kann, um einen Ordner für jede Datei (basierend auf dem Dateinamen) in einem Verzeichnis zu erstellen und die Datei dann in die neu erstellten Ordner zu verschieben.

Beispiel:

Startordner:

Dog.jpg
Cat.jpg

Der folgende Befehl eignet sich hervorragend zum Erstellen eines Ordners für jeden Dateinamen im aktuellen Arbeitsverzeichnis.

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

Ergebnisordner:

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

Ich muss noch einen Schritt weiter gehen und die Datei in den Ordner verschieben.

Was ich erreichen möchte, ist:

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

Kann mir jemand mit einem Befehl helfen, all dies zu tun?

Tom
quelle

Antworten:

10

Der zweite Befehl wäre

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

BEARBEITEN: "" für% i hinzugefügt, basierend auf dem Kommentar von and31415. tnx.

LPChip
quelle
4
Im Anschluss daran würde ich sagen, A) könnte sie kombinieren - for %i in (*) do cmda && cmdb B) könnte zuerst widerhallen for %i in (*) do @ECHO cmda && cmdb C) könnte hinzufügen Ich denke, es ist ein / R, um Unterverzeichnisse zu durchlaufen.
Barlop
2
Dieser Befehl funktioniert nicht, wenn Dateinamen Leerzeichen enthalten. Sie sollten Folgendes verwenden: for %i in (*) do move "%~i" "%~ni"Auch das ist möglicherweise nicht gut genug, da es Nebenwirkungen haben kann, wenn der Zielordner nicht vorhanden ist (z. B. Dateien, die über sich selbst "verschoben" und daher umbenannt werden). Eine einfache Lösung wäre, beide Befehle wie folgt zu kombinieren: for %i in (*) do md "%~ni" && move "%~i" "%~ni"Der Befehl setzt voraus, dass die Verzeichnisse noch nicht vorhanden sind.
and31415
2
Auch, um barlop Kommentar zu erweitern, wenn Sie cmda && cmdbdann cmdbausgeführt werden , wenn nur cmdaerfolgreich war. Wenn Sie cmda & cmdbstattdessen verwenden würden, würde der zweite Befehl unabhängig davon ausgeführt. Tatsächlich ist ein einzelnes kaufmännisches Und ( &) nur ein Befehlstrennzeichen und das doppelte kaufmännische Und ( &&) ein bedingtes Trennzeichen . Befehle, die keinen errorlevelWert festlegen , sollten mit letzterem nicht verwendet werden.
and31415
5

Führen Sie einfach diese Befehle in Reihe aus:

So erstellen Sie die Ordner für jede Datei:

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

So verschieben Sie jede Datei in ihren Ordner:

for %i in (*) do move "%i" "%~ni"
Yusuph Wickama
quelle
1
Willkommen bei Super User! Dies dupliziert eine andere Antwort und fügt keinen neuen Inhalt hinzu. Bitte posten Sie keine Antwort, es sei denn, Sie haben tatsächlich etwas Neues beizutragen.
DavidPostill
-1

Dies ist der Fall, wenn Sie einige Ordner haben, z. B.: Beispiel Jahre \ Dateiname.mp4

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

Es werden alle Dateien der ersten Ebene des Ordners aufgelistet. listet alle * .mp4 und * .mkv auf, erstellt die Ordner mit zwei Ebenen mit dem Dateinamen und verschiebt alle Dateien mit demselben Namen im Ordner der ersten Ebene in den Ordner der zweiten Ebene. Führen Sie sie im Basisordner des Jahres aus.

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

Wenn Sie keinen YEARS-Ordner der ersten Ebene haben, können Sie einfach den ersten für umgehen und den zweiten Schritt ausführen. Führen Sie ihn im Dateinamen-Basisordner aus.

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

Das && stellt sicher, dass das vorherige mkdir% ERRORLEVEL% 0 ist, um das Verschieben der Dateien auszuführen

Verwenden Sie zum Testen Folgendes:

for /d %D in (*) do for %i in (%~fD\*.mp4,%~fD\*.mkv) do echo "%~dpi%~ni" && echo "%~dpi%~ni.*" "%~dpi%~ni\"
Olívio Moura
quelle
Linke Dateien suchen: für / d% D in (*) für% i in (% ~ fD \ *) "% ~ dpi% ~ fi"
Olívio Moura
für / d% D in (*) tun für% i in (% ~ fD \ *) bewegen "% ~ fi" "D: \ TRASH \"
Olívio Moura