oomatrixoo
Goto Top

Batch bestimmte Dateien verschieben ohne Ordnerstruktur

Hallo.
Ich möchte aus mehreren Ordnern und Unterordnern bestimmte Dateien in ein anderes Verzeichnis verschieben.

Habe schon dies probiert:
Robocopy "D:\Bearbeiten" "D:\MKV" /MOV /S /R:2 /W:10 /IF "*.mp4"

Das funktioniert soweit. Es werden die mp4 Dateien verschoben, nur legt es mir auch wieder die Unterordner an. Das soll aber nicht sein.

Hat jemand eine Lösung? Danke.

EDIT:

Hab es jetzt so hinbekommen:

@echo off
For /F "Tokens=*" %%i in ('Dir /B /S "D:\Movies\*.mp4"') do Move /Y "%%~fi" "D:\Movies\MP4"

:ende

Echo.

Pause 


Jetzt wäre es noch gut, wenn die Ordner woe die Datei drin war auch gleich noch gelöscht werden.

Content-Key: 244785

Url: https://administrator.de/contentid/244785

Printed on: April 25, 2024 at 08:04 o'clock

Member: bastla
bastla Jul 27, 2014 at 18:21:04 (UTC)
Goto Top
Hallo OOmatrixOO und willkommen im Forum!

Im einfachsten Fall etwa so:
For /F "Tokens=*" %%i in ('Dir /B /S "D:\Movies\*.mp4"') do Move "%%~fi" "D:\Movies\MP4" & rd "%%~dpi" 2>nul
- das würde aber voraussetzen, dass sich nur *.mp4-Files in den Ordnern befinden und es auch keine Unterordner gibt.

Alternativ dazu könntest Du, anstatt die Dateien einzeln durchzugehen, gleich auf Ordnerebene ansetzen:
For /D %%i in ("D:\Movies\*") do echo Move "%%i\*.mp4" "D:\Movies\MP4" && echo rd /s /q "%%i"
Hier wird, nur wenn der "move"-Befehl ohne Fehler durchgeführt wurde (wird erreicht durch die Verknüpfung mit "&&"), der Ordner samt allen noch enthaltenen Dateien und Unterordnern gelöscht - solange die "echo" vor den Befehlen "move" und "rd" stehen, werden die Befehle allerdings (zum gefahrlosen Testen) nur angezeigt, aber nicht ausgeführt.

Grüße
bastla
Member: OOmatrixOO
OOmatrixOO Jul 27, 2014 at 19:39:04 (UTC)
Goto Top
Hallo.

Ja es kann vorkommen, das es Unterordner und auch andere Dateien in den Ordnern gibt. Die sollen auch mit gelöscht werden.

Wenn ich die 2. Variante probiere, bekomme ich nur die Meldung: Dateiname existiert bereits, oder die Datei konnte nicht gefunden werden.
Im Prinzip wäre die Variante genau passend.

MfG
Member: bastla
bastla Jul 27, 2014, updated at Jul 28, 2014 at 06:51:26 (UTC)
Goto Top
Hallo OOmatrixOO!

Da der Zielordner "MP4" auch unterhalb von "D:\Movies" liegt (hatte ich vorhin nicht beachtet face-sad), wird natürlich auch dieser mit verarbeitet - ausschließen ließe er sich etwa so:
For /D %%i in ("D:\Movies\*") do if /i "%%~nxi" neq "MP4" (echo Move "%%i\*.mp4" "D:\Movies\MP4" && echo rd /s /q "%%i")
Ansonsten zum Testen "echo on" verwenden - so kannst Du die einzelnen Schritte nachvollziehen ...

Grüße
bastla
Member: OOmatrixOO
OOmatrixOO Jul 27, 2014 at 20:44:15 (UTC)
Goto Top
Hallo.

Leider tut sich auch damit nix. Immer noch die gleiche Meldung. Auch wenn ich andere Ordner eintrage. Da ist irgendwo noch der Wurm drin.

MfG
Member: bastla
bastla Jul 28, 2014 at 07:01:37 (UTC)
Goto Top
Hallo OOmatrixOO!

Die Meldung
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.
sollte es eigentlich nur für Ordner geben, in denen sich keine *.mp4-Datei befindet ...

Während des Testens würde ich diese Meldung auch nicht unbedingt unterdrücken, aber danach kannst Du sie mit
Move "%%i\*.mp4" "D:\Movies\MP4\" 2>nul
verschwinden lassen.

Nur zur Sicherheit: Den Zielordner hast Du schon vor dem Verschieben erstellt?

Wenn Du die Schreibweise "D:\Movies\MP4\" (mit abschließendem "\") verwendest, erhältst Du,wenn es den Zielordner noch nicht gibt (und solange die Fehlermeldungen nicht, wie beschrieben, ins "Nichts" umgeleitet werden), die Meldung
Das System kann den angegebenen Pfad nicht finden.
Grüße
bastla
Member: OOmatrixOO
OOmatrixOO Jul 28, 2014 updated at 09:51:32 (UTC)
Goto Top
Oh ja jetzt verstehe ich.

Es funktioniert, wenn die Ordnerstruktur wie folgt ist:
D:\Movies\Unterordner\Datei

aber sobald ein weiterer Unterordner vorhanden ist D:\Movies\Unterordner\Unterordner\Datei wird dieser dann nicht mit bearbeitet.
Man müsste also noch das Abfragen weiterer Unterordner mit einbinden.

Wäre es auch zusätzlich möglich, alle Aktionen in einer Log Datei zu speichern / dokumentieren?
Und gleich eine Frage hinterher. Kann man das Ganze noch auf weitere Dateiendungen anwenden? Also die Suche auf eine weitere Endung erweitern?

Mit freundlichen Grüßen und danke für deine Hilfe und Geduld bisher.


EDIT:
OK zum Loggen habe ich glaube ich was gefunden. Einfach >>D:\Movies\MP4\Logfile.log hinten anhängen.
Member: bastla
bastla Jul 28, 2014 at 10:44:15 (UTC)
Goto Top
Hallo OOmatrixOO!

Bei einer Verschachtelung auf zwei Ebenen wäre es grundsätzlich möglich, beide abzuarbeiten - soferne es etwa für Ebene 2 (also Unter-Unterordner) einheitliche Ordnernamen gäbe, ließe sich das relativ einfach umsetzen, indem diese Ordner mit angegeben würden, also etwa
Move "%%i\Unter-Unterordnername\*.mp4" "D:\Movies\MP4\" 2>nul
- ansonsten eben mit einer weiteren Schleife oder doch per "dir /s /b".

Könntest Du vielleicht schematisch die Ordner- und Dateienstruktur beschreiben und auch genau sagen, unter welchen Umständen welche Ordner gelöscht werden sollen?

Das Miteinbeziehen mehrerer Endungen sollte übrigens kein Problem sein ...

Grüße
bastla
Member: OOmatrixOO
OOmatrixOO Jul 28, 2014, updated at Jul 31, 2014 at 08:47:21 (UTC)
Goto Top
Hallo.
Die Unterordner können verschiedene Namen haben. Sind nicht einheitlich. Gelöscht werden sollen die Ordner, aus denen die gesuchte Datei (mp4) verschoben wurde.
Das funktioniert ja auch schon perfekt. Was mir noch fehlt, ist die Abfrage der nächsten Ordnerebenen / Unterordner.

Habe gerade das probiert, aber ohne Erfolg:
@echo off
For /D %%i in ('dir /s /b "D:\Movies\*"') do if /i "%%~nxi" neq "MP4" (Move "%%i\*.mp4" "D:\Movies\MP4" 2>nul && rd /s /q "%%i") >> D:\Movies\MP4\Logfile.log
pause 

Und wie beziehe ich eine weitere Endung mit ein? Als Beispiel .avi

Mit freundlichen Grüßen
Member: bastla
bastla Jul 28, 2014 at 11:16:59 (UTC)
Goto Top
Hallo OOmatrixOO!

Du hast jetzt beide Versionen vermischt - mit "for /d" sähe das zB so aus:
For /d %%i in ("D:\Movies\*"') do if /i "%%~nxi" neq "MP4" for /d %%j in ("%%i\*") do (Move "%%j\*.mp4" "D:\Movies\MP4" 2>nul && rd /s /q "%%j") >> D:\Movies\MP4\Logfile.log 2>>&1
Unter der Annahme, dass nicht sowohl *.mp4- als auch *.avi-Dateien in einem Ordner liegen, würde es sich anbieten, getrennte Durchläufe für die verschiedenen Dateitypen durchzuführen (da ja vermutlich auch getrennte Zielordner verwendet werden) - also einfach die gleiche Zeile mit den entsprechenden Anpassungen nochmals in deinen Batch einfügen.

Sollten beide (oder noch mehr zu verschiebende) Dateitypen innerhalb eines Ordners möglich sein, würde ich eher zunächst verschieben und danach nochmals alle Ordner durchgehen und nur solche löschen, in denen sich keine der Dateitypen mehr befinden ...

Grüße
bastla
Member: OOmatrixOO
OOmatrixOO Jul 28, 2014, updated at Jul 31, 2014 at 08:48:05 (UTC)
Goto Top
Hallo.
Ich habe es jetzt so:
@echo off
For /d %%i in ("D:\Movies\*") do if /i "%%~nxi" neq "MP4" for /d %%j in ("%%i\*") do (Move "%%j\*.mp4" "D:\Movies\MP4" 2>nul && rd /s /q "%%j") >> D:\Movies\MP4\Logfile.log 2>>&1
For /D %%i in ("D:\Movies\*") do if /i "%%~nxi" neq "MP4" (Move "%%i\*.mp4" "D:\Movies\MP4" 2>nul && rd /s /q "%%i") >> D:\Movies\MP4\Logfile.log 2>>&1
pause

So werden mir alle Dateien verschoben. Auch die im Unter-Unterordner. Ich hoffe, ich habe das so richtig gemacht. Denn lasse ich die 2. For Zeile weg, werden nur die Dateien im Unter-Unterordner verschoben, aber Dateien,die in einem 1. Unterordner liegen nicht.

Kleiner Schönheitsfehler:
Wird eine Datei aus einem Unter-Unterordner verschoben, wird auch der Unter-Unterordner gelöscht, aber nicht der Unterordner.
Ich denke aber, damit kann ich leben.
Member: bastla
bastla Jul 29, 2014 at 14:13:58 (UTC)
Goto Top
Hallo OOmatrixOO!
Ich hoffe, ich habe das so richtig gemacht.
Richtig ist es, wenn der Batch das macht, was Du willst ... face-wink
Wird eine Datei aus einem Unter-Unterordner verschoben, wird auch der Unter-Unterordner gelöscht, aber nicht der Unterordner.
Kann er ja nicht, da in anderen Unter-Unterordnern noch Daten vorhanden sein könnten. Wenn Du genaue Kriterien hast, bei welchem Inhalt (bzw Nicht-Inhalt) ein Ordner entbehrlich ist, könntest Du, wie oben schon angesprochen, am Ende nochmals eine Schleife über alle Unterordner (nicht Unter-UInterordner) laufen lassen und diese einzeln (aber samt aller darin enthaltenen Unter-Unterordner) entfernen - etwa, wenn alle weg sollen, in / unter denen keine .mp4- und keine .avi-Dateien mehr liegen (ungetestet):
for /d %%i in ("D:\Movies\*") do if /i "%%~nxi" neq "MP4" dir /s /b "%%i\*.avi" "%%i\*.mp4">nul 2>nul || echo rd /s /q "%%i"
Das "echo" ist natürlich wieder zum Testen drin ...

Grüße
bastla
Member: OOmatrixOO
OOmatrixOO Jul 29, 2014, updated at Jul 31, 2014 at 08:48:47 (UTC)
Goto Top
Wow super. So funktioniert es wie ich es haben möchte.

Eins hätte ich noch face-wink
Kann ich mir auch loggen lassen, welche Ordner gelöscht werden?

for /d %%i in ("D:\Movies\*") do if /i "%%~nxi" neq "MP4" dir /s /b "%%i\*.avi" "%%i\*.mp4">nul 2>nul || echo rd /s /q "%%i" >>D:\Movies\MP4\Logfile.log

schreibt mir leider keine Daten der gelöschten Ordner ins File. Das wäre das einzige was mich noch interessieren würde. Falls dies nicht geht, wäre es auch nicht weiter tragisch.

Ich danke dir für deine super Unterstützung.
Mit freundlichen Grüßen
Member: bastla
Solution bastla Jul 29, 2014, updated at Aug 02, 2014 at 15:22:52 (UTC)
Goto Top
Hallo OOmatrixOO!

Zum Loggen kannst Du einfach ein "echo" dranhängen:
for /d %%i in ("D:\Movies\*") do if /i "%%~nxi" neq "MP4" dir /s /b "%%i\*.avi" "%%i\*.mp4">nul 2>nul || (echo rd /s /q "%%i" && echo "%%i">>D:\Movies\MP4\Logfile.log)
Noch eine Anmerkung (zumindest für Deinen nächsten Thread, obwohl sich Kommentare ja auch editieren lassen): Wir hätten für (Batch-)Code eine pasende Formatierungsmöglichkeit ...

Grüße
bastla
Member: OOmatrixOO
OOmatrixOO Jul 31, 2014 updated at 22:22:09 (UTC)
Goto Top
Hallo.
Bisher klappt alles super. Dank deiner Hilfe.
Danke auch für den Tip mit den Formatierungen hier im Forum. Habe mal den Thread angepasst.

Mit freundlichen Grüßen