Anzeige

Dateien verschieben nach Formate ( Batch )

#1
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 :confused:
2. falls mehrere Dateien mit dem selben Namen vorhanden sind soll es die nicht ersetzen (!)

Hoffe bekomme schnelle Antwort
Danke im voraus^^
 

merzi86

Erfahrenes Mitglied
#2
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.
 
#3
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 :D und die If - Abfrage ist mir auch ungewohnt, If ... goto ... naja, desto trotz Danke :D
 
#4
Hi,

ich weiß leider nicht wie man das in Batch machen würde, habs aber mal in Python versucht:
Code:
# -*- 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
 
Zuletzt bearbeitet:

HonniCilest

Erfahrenes Mitglied
#5
Hallo,

das könnte in etwa so aussehen:
Code:
@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:
Code:
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"
        }
    }
}
 
Zuletzt bearbeitet:
#6
@ javaDeveloper2011
Okay, aber von Python hab ich keine Ahnung :D

@ 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 )
 
Zuletzt bearbeitet:

HonniCilest

Erfahrenes Mitglied
#8
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:
Code:
move -literalpath $_.FullName "C:\test\$extension"
Insgesamt bleibe ich bei meiner Meinung, nutze lieber Powershell. Es ist kürzer und einfacher verständlich ;-)
 
Zuletzt bearbeitet:
Anzeige

Neue Beiträge

Anzeige