Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16
  1. #1
    Riesenboiken
    Themenstarter

    Registriert
    06.2004
    Beiträge
    290

    Dateien nach Endung sortieren

    Hm..., jetzt habe ich schon wieder was gebastelt, obwohl ich AppleScript überhaupt nicht beherrsche. Habe lange gesucht und aus verschiedenen Scripts nun selber eins zusammengebaut. Das erfüllt irgendwie seinen Zweck, könnte aber sicherlich eleganter gehen. Hier die Fakten:

    Ausgangslage:
    - Verzeichnis mit JPG- und RAW-Dateien (z.B. Speicherkarte oder ein Ordner auf dem Schreibtisch)

    gewünschtes Ergebnis:
    - Droplet, welches JPG- und RAW-Dateien in zwei neue Ordner einsortiert

    erreichtes Ergebnis:
    - Droplet, welches JPG- und RAW-Dateien in zwei neue Ordner einsortiert

    Schwachstellen (z.B.):
    - jede einzelne Dateiverschiebung wird mit einem Ton quittiert (50 Dateien v.d. Karte auf den Rechner = 50x "Plöng"...)
    - funktioniert nur mit Dateien, nicht mit gefülltem Ordner
    - es werden zwei Ordner angelegt, auch wenn mal nur ein Dateityp im Ausgangsordner liegt
    - etc.

    -------------------------
    property JPG_foldername : "-> JPG"
    property NEF_foldername : "-> NEF"
    property JPG_extension_list : {"jpg", "JPG"}
    property NEF_extension_list : {"nef", "NEF"}
    on open my_files
    tell application "Finder"
    make new folder with properties {name:JPG_foldername}
    make new folder with properties {name:NEF_foldername}
    repeat with i in my_files
    if (JPG_extension_list contains (name extension of i)) then
    move i to folder JPG_foldername
    end if
    if (NEF_extension_list contains (name extension of i)) then
    move i to folder NEF_foldername
    end if
    end repeat
    end tell
    end open
    -------------------------

    Bin für jeden Tipp dankbar!
    Geändert von Hifi (01.12.2011 um 14:02 Uhr)

  2. #2
    Riesenboiken
    Themenstarter

    Registriert
    06.2004
    Beiträge
    290
    O.k., das mit dem Ton ist geklärt, siehe unten. Aber wie mache ich, dass das Droplet funktioniert, wenn ich einen ganzen Ordner draufziehe...?

    Code:
    property JPG_foldername : "-> JPG"
    property NEF_foldername : "-> NEF"
    property JPG_extension_list : {"jpg", "JPG"}
    property NEF_extension_list : {"nef", "NEF"}
    on open my_files
    	
    	set my_alert_volume to alert volume of (get volume settings)
    	set volume alert volume 10
    	
    	tell application "Finder"
    		make new folder with properties {name:JPG_foldername}
    		make new folder with properties {name:NEF_foldername}		
    		repeat with i in my_files
    			if (JPG_extension_list contains (name extension of i)) then
    				move i to folder JPG_foldername
    			end if
    			if (NEF_extension_list contains (name extension of i)) then
    				move i to folder NEF_foldername
    			end if
    		end repeat
    	end tell
    	
    	set volume alert volume my_alert_volume
    	
    end open

  3. #3
    Luxemburger Triumph Avatar von sedna
    Registriert
    10.2008
    Beiträge
    498
    Hallo!

    In den Finder tell Block
    set myFileList to entire contents of (my_files as alias) as alias list

    und diese Zeile anpassen
    repeat with i in myFileList

    Gruß

  4. #4
    Riesenboiken
    Themenstarter

    Registriert
    06.2004
    Beiträge
    290
    Ja, jetzt klappts mit einem Ordner und den darin enthaltenen Dateien. Aber auf diese Weise gibts nun einen Fehler, wenn ich eine oder mehrere Datei(en) (ohne Ordner) auf das Droplet ziehe:

    Can't make «class ects» of alias "Pafd:zu:meinem:JPG" into type «class alst»

    Aber gut, jetzt habe ich zwei Droplets und kann je nach Ausgangslage das eine oder andere verwenden... Oder gibts dafür auch eine Lösung? Ich habe wirklich den ganzen Tag gesucht, mir verschiedenste Scripts angeschaut, Manuals gelesen und viel probiert - aber ich begreife nichts. Eigentlich ist es ja ein Thema, was immer mal auftaucht, aber ich habe tatsächlich kein Droplet gefunden, welches meine Wünsche erfüllt.

  5. #5
    Luxemburger Triumph Avatar von sedna
    Registriert
    10.2008
    Beiträge
    498
    Hallo Hifi!

    Ich glaube dir nicht, dass du nichts begreifst. So wie das hier aussieht, hast du zumindest eine Ahnung von AppleScript.

    Aber bevor du wieder einen ganzen Tag lang suchst:
    Schau dir mal den "Automator" an. Ist nicht so flexibel wie AppleScript, aber kann auf der anderen Seite Dinge, die nicht mit AS realisierbar sind.
    Und ein Droplet (Automator-Programme sind immer auch Droplets) für den gewünschten Ablauf ließe sich relativ einfach erstellen.
    Seit 10.5 arbeitet der Automator mit Variablen (wie in AS). Die wirst du brauchen. Des weiteren wird der Output jeder Aktion an die nächste übergeben. Das kann und muss man manchmal unterbinden (mit einem Rechtsklick in den Kopf der jeweils folgenden Aktion -> "Eingabe ignorieren")
    Viel Spaß beim Basteln (ich bin sicher, dass du das in weniger als einem Tag schaffst)...

    Wenn ich schon aushole:
    Mit dem Programm Digitale Bilder kann man Automator Abläufe ausführen (Ablauf als Plug-in für Digitale Bilder speichern)
    Und in Digitale Bilder lässt sich einstellen, dass dieser beim Anschluss einer bestimmten Speicherkarte automatisch abläuft...

    Zum AppleScript:
    Ja, da gibt es eine Lösung.... bzw. mehrere...
    Das if - else Statement kennst du schon. Daneben gibt es noch try - on error.

    In der repeat Schleife müsste man jedes Objekt zuerst unterscheiden, ob Datei oder Ordner. Dann entweder den Ordner in einer weiteren repeat Schleife abarbeiten oder aber die Datei bewegen....
    Ordner und Dateien lassen man auf mehrere Arten unterscheiden...
    ....im AppleScript Pfad ... Ordner haben meistens auch keine Dateiendungen... oder aber an den Attributen
    Wähle mal ein Ordner oder eine Datei im Finder aus und lass folgendes Skript laufen. Beobachte auch den Unterschied im Pfad

    tell application "Finder" to set input to selection
    set theItem to item 1 of input as string
    display alert theItem


    if folder of (info for alias theItem) is true then
    display alert "Ordner"
    else
    display alert "Datei"
    end if


    Wenn du gar nicht klar kommst, helfe ich dir gerne weiter (gilt sowohl für Automator wie AS)

    Gruß
    Sedna

  6. #6
    Riesenboiken
    Themenstarter

    Registriert
    06.2004
    Beiträge
    290
    Hallo & Danke für die Tipps und Infos. Natürliche habe ich manches aus AS begriffen, aber das meiste ergibt sich durch langwieriges ausprobieren und scheitern (ähnlich wie "try - on error..."), ohne dass ich immer verstehe, wie und warum da was passiert.

    Unter macosxautomation.com habe ich zwischenzeitlich ein "Generic Recursive File Processing Droplet" gefunden, welches ich für meine Zwecke angepasst habe. Jetzt läuft alles, obwohl es sicherlich eleganter und mit weniger als hundert Zeilen Code gehen würde.

    Den Automator habe ich mir auch immer mal wieder angeschaut ebenso wie "Digitale Bilder". Vielleicht greife ich bei einer anderen Gelegenheit mal darauf zurück, momentan bin ich mit "meinem" Script und insbesondere mit der Kombination aus manuellem und automatisiertem Vorgehen (Daten auf Droplet ziehen / Script verarbeitet die Daten) recht zufrieden.

  7. #7
    Galloway Pepping Avatar von fyysh
    Registriert
    01.2010
    Ort
    Rheinknie
    Alter
    33
    Beiträge
    1.348
    Hier 'ne andere mögliche Lösung (so würde ich das machen).
    Diese benutzt die shell (do shell script), um mit dem Filesystem zu interagieren.

    Vorteil ist, dass du dich nicht um Ordner und Dateien und auch nicht um das Filtern derselben kümmern must. Das ist dann schon erledigt (falls du wissen willst, warum, schau mal hier).
    Ein weiterer Vorteil ist, dass find bei einer großen Dateianzahl wesentlich schneller agiert, als der Finder mit entire contents. Wenn so ein Script auf viele viele Dateien angewandt werden soll, dann ist es besser auf dieser Weise. Hab's grad mit ca.5k Dateien laufen lassen - das war recht fix.

    An sich ist das folgende Script also eine Kombination von bequemen Droplets und den stärken der Kommandozeile.
    @TE: Nur den Dingdong, den müsstest du schon selber dazutun

    Hier:
    Code:
    property JPG_foldername : "-> JPG"
    property NEF_foldername : "-> NEF"
    property JPG_extension : "[Jj][Pp][Gg]"
    property NEF_extension : "[Nn][Ee][Ff]"
    
    
    
    
    on run
        --zum testen im as scripteditor. 
        --hier werden die ordner ~/TMP/bla und ~/TMP/ble als gedropte ordner simuliert,
        --welche jeweils *.jpg und *.nef files enthalten (zum testen)
        set droppedItems to {¬
            (((path to home folder) as string) & "TMP:bla:") as alias, ¬
            (((path to home folder) as string) & "TMP:ble:") as alias}
        
        doStuff(droppedItems)
    end run
    
    
    on open droppedItems
        doStuff(droppedItems)
    end open
    
    
    on doStuff(droppedItems) --das eigentliche script
        
        set findOpts to " -maxdepth 1 -type f -name " --space vorn und hinten!
        -- für den weiter unten auftauchenden find shell befehl, der dann so aussieht:
        -- find /path/of/dropped/item -maxdepth 1 -type f -name '*.[Ee][Xx][Tt]'
        
        repeat with aItem in droppedItems
            repeat 1 times --fake continue
                try
                    set aItemPosix to POSIX path of aItem
                on error
                    exit repeat
                end try
                
                --alle jpegs in eine liste
                set jpgFiles to paragraphs of ¬
                    (do shell script ¬
                        "find " & quoted form of aItemPosix & findOpts & quoted form of ("*." & JPG_extension))
                
                --alle nefs in eine liste
                set nefFiles to paragraphs of ¬
                    (do shell script ¬
                        "find " & quoted form of aItemPosix & " -type f -name " & quoted form of ("*." & NEF_extension))
                
                if (count of jpgFiles) > 0 then mvFiles2Dest(jpgFiles, aItemPosix, JPG_foldername)
                if (count of nefFiles) > 0 then mvFiles2Dest(nefFiles, aItemPosix, NEF_foldername)
            end repeat
            
        end repeat
    end doStuff
    
    
    on mvFiles2Dest(fileList, destParent, destName)
        --destParent muss posix sein!
        
        --dafür sorgen, dass alle pfade in der liste gequoted sind
        repeat with i from 1 to (count of fileList)
            set item i of fileList to quoted form of (item i of fileList)
        end repeat
        
        --die liste in einen space getrennten string konvertieren
        set oATID to AppleScript's text item delimiters
        set AppleScript's text item delimiters to space
        set fileList to fileList as string
        set AppleScript's text item delimiters to oATID
        
        --ziel erstellen und liste dahin bewegen
        set fileListDest to quoted form of (destParent & "/" & destName)
        try
            do shell script ¬
                "mkdir -vp " & fileListDest & "&&" & ¬
                "mv -fv " & fileList & space & fileListDest
        end try
    end mvFiles2Dest
    The cause of the problem is:
    Don't worry; it's been deprecated.
    The new one is worse.

  8. #8
    Riesenboiken
    Themenstarter

    Registriert
    06.2004
    Beiträge
    290
    Oh prima, Danke! Das werde ich mir mal genauer anschauen! Ein "Schnelltest" hat ergeben, dass es mit einem typischen Ordner (mit NEF- & JPG-Dateien) wunderbar funktioniert. Ein wesentlicher Unterschied im Ergebnis ist, dass der NEF- und JPG-Ordner als Unterordner in dem verarbeiteten Ordner angelegt werden, mal schauen ob ich das anpassen kann...

    Mit Datei(en) oder Unterordnern funktionerts aber nicht. Beispiel: "Ordner A" enthält "Ordner A1" und "Ordner A2", in beiden Ordnern liegen jeweils JPG und NEF (Situation z.B., wenn der Bildzähler in der Kamera nach 999999 o.ä. wieder bei 1 anfängt, dann wird ein neuer Ordner auf der Speicherkarte angelegt). Aber auch das dürfte sich ja anpassen lassen.

    Wie gesagt, ich schau mir alles noch mal an. Und das Dingdong..., na ja, mal schauen. Aber wer oder was ist "@TE"?

  9. #9
    Galloway Pepping Avatar von fyysh
    Registriert
    01.2010
    Ort
    Rheinknie
    Alter
    33
    Beiträge
    1.348
    Wo wolltest du denn den die JPG und NEF folder haben?

    Damit find rekursiv agiert, müsstest du
    set findOpts to " -maxdepth 1 -type f -name " --space vorn und hinten!
    in
    set findOpts to " -type f -name " --space vorn und hinten!
    ändern. Dann findet der auch alles in den Unterordnern der Quelle.

    EDIT:
    Hatte ich nicht gemacht, weil der ja die JPG und NEF Ordnern da rein packt. Aber wenn du die eh woanders haben möchtest, dann geht das.

    Du müsstest eine property hinzufügen (ganz oben):
    property destParent:"/Ordner/wo/JPG/un/NEF/erstellt/werden"
    (kannst vom Finder in den Script Editor reindroppen, dann kriegste den posix Pfad)

    und folgende Zeilen Ändern:

    if (count of jpgFiles) > 0 then mvFiles2Dest(jpgFiles, aItemPosix, JPG_foldername)
    if (count of nefFiles) > 0 then mvFiles2Dest(nefFiles, aItemPosix, NEF_foldername)
    in
    if (count of jpgFiles) > 0 then mvFiles2Dest(jpgFiles, JPG_foldername)
    if (count of nefFiles) > 0 then mvFiles2Dest(nefFiles, NEF_foldername)



    on mvFiles2Dest(fileList, destParent, destName)
    in
    on mvFiles2Dest(fileList, destName)
    Geändert von fyysh (02.12.2011 um 19:13 Uhr)
    The cause of the problem is:
    Don't worry; it's been deprecated.
    The new one is worse.

  10. #10
    Riesenboiken
    Themenstarter

    Registriert
    06.2004
    Beiträge
    290
    Ach so, kann ja keiner wissen - in dem bisherigen Script werden die beiden neuen Ordner auf dem Schreibtisch angelegt. Das heisst bei einer Speicherkarte z.B.: "Karte manuell rein - optional manuell ins Kartenverzeichnis schauen was da so drin ist - manuell Kartensymbol aufs Droplet ziehen - Dateien werden von der Karte in zwei neu angelegte Ordner auf den Schreibtisch kopiert".

    Aber ich schau mir das noch mal an, das müsste ich ja hinbekommen. Ist ja schliesslich kein Scriptbestellservice hier

    Und Danke für die rekursiv-Anleitung. Wenn man das einmal weiss ist es ja echt easy.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •