1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Dateien verschieben nach Formate ( Batch )

Dieses Thema im Forum "Sonstige Sprachen" wurde erstellt von oO-NichtsNutz-Oo, 10. Dezember 2013.

  1. oO-NichtsNutz-Oo

    oO-NichtsNutz-Oo Grünschnabel

    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:D
     
  2. merzi86

    merzi86 Erfahrenes Mitglied

    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. oO-NichtsNutz-Oo

    oO-NichtsNutz-Oo Grünschnabel

    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. javaDeveloper2011

    javaDeveloper2011 Erfahrenes Mitglied

    Hi,

    ich weiß leider nicht wie man das in Batch machen würde, habs aber mal in Python versucht:
    Code (Text):
    1. # -*- coding: utf-8 -*-
    2.  
    3. import os, operator, itertools, shutil
    4.  
    5. def rec(directory):
    6.     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)])
    7.  
    8. for f in rec('<ORDNER_NAME>'):
    9.     if not os.path.isdir('_/'+f.split('.')[-1].lower()):
    10.         os.makedirs('_'+os.sep+f.split('.')[-1].lower())
    11.     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: 11. Dezember 2013
  5. HonniCilest

    HonniCilest Erfahrenes Mitglied

    Hallo,

    das könnte in etwa so aussehen:
    Code (Text):
    1. @echo off
    2.  
    3. REM Alle Dateien im Hauptverzeichnis selbst
    4. FOR /F "delims=" %%j IN ('dir /b/s C:\temp\source\') DO (
    5.     call:MoveFunction %%j
    6. )
    7.  
    8. REM Alle Dateien im Unterverzeichnissen vom Hauptverzeichnis
    9. FOR /F "delims=" %%i IN ('dir /ad /b /s C:\temp\source\') DO (
    10.     FOR /F "delims=" %%j IN ('dir /b/s %%i') DO (
    11.         call:MoveFunction %%j
    12.     )
    13. )
    14.  
    15. pause
    16.  
    17. :MoveFunction
    18. REM Achtung funktioniert nur mit Extensions der Laenge 3
    19. set param=%~1
    20. set extension=%param:~-3%
    21. if not exist C:\temp\%extension%\ mkdir C:\temp\%extension%\
    22. if not exist %param% move %param% C:\temp\%extension%\
    23. 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 (Text):
    1. dir "C:\test\root" -recurse | %{
    2.     if (-Not $_.PsIsContainer) {
    3.         $extension = [System.IO.Path]::GetExtension($_).Substring(1)
    4.         if (-Not (Test-Path "C:\test\$extension")) {
    5.             mkdir "C:\test\$extension"
    6.         }
    7.         if (-Not (Test-Path "C:\test\$extension\$_")) {
    8.             move $_.FullName "C:\test\$extension"
    9.         }
    10.     }
    11. }
     
    Zuletzt bearbeitet: 11. Dezember 2013
  6. oO-NichtsNutz-Oo

    oO-NichtsNutz-Oo Grünschnabel

    @ 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: 11. Dezember 2013
  7. oO-NichtsNutz-Oo

    oO-NichtsNutz-Oo Grünschnabel

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

    HonniCilest Erfahrenes Mitglied

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

    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 (Text):
    1. 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: 11. Dezember 2013
Die Seite wird geladen...