# Dateien verschieben nach Formate ( Batch )



## oO-NichtsNutz-Oo (10. Dezember 2013)

Hallo Leute,

Ich wollte eine menge Dateien je nach Format in ein anderen Ordner verschieben. Das Problem ist halt es sind viele Ordner mit Unterordner u.s.w. und das ich wirklich nicht viel mit Batch arbeite außer mal ein paar Programme mit zugewiesenem RAM zu starten.

z.B.:
Vorher ( so wie es jetzt ist ):
Z:\...\0001.jpg
Z:\...\0002.jpg
Z:\...\0001.png
nachher ( so wie ich es haben will ):
Z:\jpg\0001.jpg
Z:\jpg\0002.jpg
Z:\png\0001.png

1. Ich weiß nicht so richtig wie ich das angehen soll 
2. falls mehrere Dateien mit dem selben Namen vorhanden sind soll es die nicht ersetzen 

Hoffe bekomme schnelle Antwort
Danke im voraus^^


----------



## merzi86 (10. Dezember 2013)

Als erstes müsstest du den jeweiligen Ordner mittels einer for-Schleife durchlaufen lassen und die alles Filter, was nicht gewollt ist (z.B. Ordner) und die Überspringen.

Wenn eine Datei gefunden wurde müsstest du den Dateinamen am . (Punkt) Splitten und anschließend den 2. Teil überprüfen.

Danach den jeweiligen Ordner den du mit den 2. Teil herausgefunden hast mittels if exist abfragen, ob die Datei existiert.

Wenn sie existiert könntest du ja den Dateinamen beim move ändern (z.b. mit ein index).
Allerdings muss danach noch einmal überprüft werden nicht das bereits eine Datei mit dem neuen Namen bereits existiert.

Wenn die Datei nicht existiert kann die Datei zum Abschluss einfach mit move verschieben.


----------



## oO-NichtsNutz-Oo (10. Dezember 2013)

Okay, zumindest weiß ich jetzt wie ich algorithmisch vorgehen muss, aber ich denke eher mal das ich am Sourcecode versagen werde, weil ich in Batch relativ neu bin und ich das irgendwie nicht mag das s man keine eigene Funktion bestimmen kann zumindest weiß ich nicht wie  und die If - Abfrage ist mir auch ungewohnt, If ... goto ... naja, desto trotz Danke


----------



## javaDeveloper2011 (10. Dezember 2013)

Hi,

ich weiß leider nicht wie man das in Batch machen würde, habs aber mal in Python versucht:

```
# -*- coding: utf-8 -*-

import os, operator, itertools, shutil

def rec(directory):
	return reduce(operator.add, [rec(directory + os.sep + f) for f in os.listdir(directory) if os.path.isdir(f)], [directory + os.sep + f for f in os.listdir(directory) if not os.path.isdir(f)])

for f in rec('<ORDNER_NAME>'):
	if not os.path.isdir('_/'+f.split('.')[-1].lower()):
		os.makedirs('_'+os.sep+f.split('.')[-1].lower())
	shutil.copy2(f, '_'+os.sep+f.split('.')[-1].lower() + os.sep + f.split(os.sep)[-1])
```
Also es wird zwar zwischen 'jpeg' und 'jpg', aber nicht zwischen 'jpg' und 'JPG' unterschieden.
Das Script sortiert alle Dateien in *<ORDNER_NAME>* in Ordner unterhalb von *<ORDNER_NAME>*\_

//EDIT
Falls es do jemand benutzen will: Achtung: Wenn 2 Dateien gleich heißen wird nur eine kopiert!
//EDIT

Hoffe das hilft,
javaDeveloper2011


----------



## HonniCilest (11. Dezember 2013)

Hallo,

das könnte in etwa so aussehen:

```
@echo off

REM Alle Dateien im Hauptverzeichnis selbst
FOR /F "delims=" %%j IN ('dir /b/s C:\temp\source\') DO (
	call:MoveFunction %%j
)

REM Alle Dateien im Unterverzeichnissen vom Hauptverzeichnis
FOR /F "delims=" %%i IN ('dir /ad /b /s C:\temp\source\') DO (
	FOR /F "delims=" %%j IN ('dir /b/s %%i') DO (
		call:MoveFunction %%j
	)
)

pause

:MoveFunction
REM Achtung funktioniert nur mit Extensions der Laenge 3
set param=%~1
set extension=%param:~-3%
if not exist C:\temp\%extension%\ mkdir C:\temp\%extension%\
if not exist %param% move %param% C:\temp\%extension%\
goto:eof
```

Edit:
Ich muss aber zugeben, dass ich bei solchen Beispielen eher ein Fan von Powershell bin. Daher gebe ich dir auch hier ein Beispiel:

```
dir "C:\test\root" -recurse | %{
    if (-Not $_.PsIsContainer) {
        $extension = [System.IO.Path]::GetExtension($_).Substring(1)
        if (-Not (Test-Path "C:\test\$extension")) {
            mkdir "C:\test\$extension"
        }
        if (-Not (Test-Path "C:\test\$extension\$_")) {
            move $_.FullName "C:\test\$extension"
        }
    }
}
```


----------



## oO-NichtsNutz-Oo (11. Dezember 2013)

@ javaDeveloper2011
Okay, aber von Python hab ich keine Ahnung 

@ HonniCilest
Muss ja einfach "C:\temp\source" durch "Z:\Dateien\" und "C:\temp\%extensions%" durch "Z:\Test\%extensions%" umändern oder wäre das falsch?
Wenn ich den Sourcecode kopiere und einfüge, passiert bei mir folgendes:
in den Ordner Test entstehen viele Ordner ohne Dateien
Die Ordnernamen sind auch korios die großgeschriebenen 
z.B. JPG PNG sind auch vorhandene Formate 
aber sowas wie ~-3; 013; 101; ebe; eon; fen; gie; sind abschnitte aus Dateinamen

Powershell hab ich noch nicht getestet ( weiß nicht mal welches Format die haben )


----------



## oO-NichtsNutz-Oo (11. Dezember 2013)

Okay, die Powershell geht 
Bis auf Ausnahmen "[000037].jpg" wird wahrscheinlich an den Klammern liegen ^^


----------



## HonniCilest (11. Dezember 2013)

> Muss ja einfach "C:\temp\source" durch "Z:\Dateien\" und "C:\temp\%extensions%" durch "Z:\Test\%extensions%" umändern oder wäre das falsch?



Natürlich, du musst meine Testpfade durch deine korrekten Pfade ersetzen.



> aber sowas wie ~-3; 013; 101; ebe; eon; fen; gie; sind abschnitte aus Dateinamen



Merkwürdig, sowas hatte ich nicht. Vielleicht liegt das jedoch an meinen rudimentären Testdaten. Ich sehe auch gerade ich habe da teilweise echt Mist gemacht, wo ich aber nochmal drüber nachdenken müsste ;-) Was jedoch sein könnte wo ich mir nicht sicher bin: ggf. springt er nach den Schleifen, d.h. nach Pause, nochmal in die Funktion rein. In diesem Fall müsstest du nochmal eine Sprungmarke nach den Schleifen einbauen. Allerdings würde mir das auch nur einen dieser Order Order erklären und nicht 7... Oder enthalten manche Dateinamen vielleicht Leerzeichen? Keine Ahnung wie cmd an dieser Stelle darauf reagiert...

Edit:
Bei den Klammern kannst du dir behelfen, indem du die Zeile wie folgt abänderst:

```
move -literalpath $_.FullName "C:\test\$extension"
```

Insgesamt bleibe ich bei meiner Meinung, nutze lieber Powershell. Es ist kürzer und einfacher verständlich ;-)


----------

