• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

Dateien nach Endung sortieren

Hifi

Schöner von Nordhausen
Registriert
10.06.04
Beiträge
319
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!
 
Zuletzt bearbeitet:

Hifi

Schöner von Nordhausen
Registriert
10.06.04
Beiträge
319
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
 

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.359
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ß
 

Hifi

Schöner von Nordhausen
Registriert
10.06.04
Beiträge
319
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.
 

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.359
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
 

Hifi

Schöner von Nordhausen
Registriert
10.06.04
Beiträge
319
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. :)
 

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
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:
[B]property[/B] JPG_foldername : "-> JPG"
[B]property[/B] NEF_foldername : "-> NEF"
[B]property[/B] JPG_extension : "[Jj][Pp][Gg]"
[B]property[/B] NEF_extension : "[Nn][Ee][Ff]"




[B]on[/B] [B]run[/B]
    --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)
    [B]set[/B] droppedItems [B]to[/B] {¬
        ((([B]path to[/B] home folder) [B]as[/B] [I]string[/I]) & "TMP:bla:") [B]as[/B] [I]alias[/I], ¬
        ((([B]path to[/B] home folder) [B]as[/B] [I]string[/I]) & "TMP:ble:") [B]as[/B] [I]alias[/I]}
    
    doStuff(droppedItems)
[B]end[/B] [B]run[/B]


[B]on[/B] [B]open[/B] droppedItems
    doStuff(droppedItems)
[B]end[/B] [B]open[/B]


[B]on[/B] doStuff(droppedItems) --das eigentliche script
    
    [B]set[/B] findOpts [B]to[/B] " -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]'
    
    [B]repeat[/B] [B]with[/B] aItem [B]in[/B] droppedItems
        [B]repeat[/B] 1 [B]times[/B] --fake continue
            [B]try[/B]
                [B]set[/B] aItemPosix [B]to[/B] POSIX path [B]of[/B] aItem
            [B]on[/B] [B]error[/B]
                [B]exit[/B] [B]repeat[/B]
            [B]end[/B] [B]try[/B]
            
            --alle jpegs in eine liste
            [B]set[/B] jpgFiles [B]to[/B] [I]paragraphs[/I] [B]of[/B] ¬
                ([B]do shell script[/B] ¬
                    "find " & quoted form [B]of[/B] aItemPosix & findOpts & quoted form [B]of[/B] ("*." & JPG_extension))
            
            --alle nefs in eine liste
            [B]set[/B] nefFiles [B]to[/B] [I]paragraphs[/I] [B]of[/B] ¬
                ([B]do shell script[/B] ¬
                    "find " & quoted form [B]of[/B] aItemPosix & " -type f -name " & quoted form [B]of[/B] ("*." & NEF_extension))
            
            [B]if[/B] ([B]count[/B] [B]of[/B] jpgFiles) > 0 [B]then[/B] mvFiles2Dest(jpgFiles, aItemPosix, JPG_foldername)
            [B]if[/B] ([B]count[/B] [B]of[/B] nefFiles) > 0 [B]then[/B] mvFiles2Dest(nefFiles, aItemPosix, NEF_foldername)
        [B]end[/B] [B]repeat[/B]
        
    [B]end[/B] [B]repeat[/B]
[B]end[/B] doStuff


[B]on[/B] mvFiles2Dest(fileList, destParent, destName)
    --destParent muss posix sein!
    
    --dafür sorgen, dass alle pfade in der liste gequoted sind
    [B]repeat[/B] [B]with[/B] i [B]from[/B] 1 [B]to[/B] ([B]count[/B] [B]of[/B] fileList)
        [B]set[/B] [I]item[/I] i [B]of[/B] fileList [B]to[/B] quoted form [B]of[/B] ([I]item[/I] i [B]of[/B] fileList)
    [B]end[/B] [B]repeat[/B]
    
    --die liste in einen space getrennten string konvertieren
    [B]set[/B] oATID [B]to[/B] AppleScript's text item delimiters
    [B]set[/B] AppleScript's text item delimiters [B]to[/B] space
    [B]set[/B] fileList [B]to[/B] fileList [B]as[/B] [I]string[/I]
    [B]set[/B] AppleScript's text item delimiters [B]to[/B] oATID
    
    --ziel erstellen und liste dahin bewegen
    [B]set[/B] fileListDest [B]to[/B] quoted form [B]of[/B] (destParent & "/" & destName)
    [B]try[/B]
        [B]do shell script[/B] ¬
            "mkdir -vp " & fileListDest & "&&" & ¬
            "mv -fv " & fileList & space & fileListDest
    [B]end[/B] [B]try[/B]
[B]end[/B] mvFiles2Dest
 

Hifi

Schöner von Nordhausen
Registriert
10.06.04
Beiträge
319
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"?
 

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
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)
 
Zuletzt bearbeitet:

Hifi

Schöner von Nordhausen
Registriert
10.06.04
Beiträge
319
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 :-D

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

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
Da fällt mir ein:
Wenn du es so änderst, würde es aber identisch benannte Dateien im Ziel mit neu gefundenen überschreiben!
Wenn das sowieso nicht vorkommen kann, dann ist es egal, aber falls es doch vorkommen kann, dann müsste man das anders aufziehen.
 

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.359
@fyysh:
Da bist du mir ja richtig an den Karren gefahren :-D
Hatte ich doch HiFi schon fast soweit, dass er/sie sich mal richtig mit der Materie auseinander setzt :cool:

@Hifi:
fyysh hat wie immer sehr aufmerksam gelesen und erkannt, dass es sich hier wohl um große Dateimengen handelt. Ein Shell Skript ist da natürlich wesentlich flotter unterwegs.Da hast du nicht nur ein TipTop Skript, sondern auch noch bestens beschrieben, was da im einzelnen passiert.
Das ist ja mal ein 1A Service! :)

Gruß
 
Zuletzt bearbeitet:

Guy.brush

Weißer Winterkalvill
Registriert
15.12.08
Beiträge
3.545
Ist zwar nicht direkt AppleScript, aber ich hab mich mal an einer Automator-Lösung versucht und dabei ist folgendes rausgekommen: Link
Ich hab es allerdings mal mit PNG und PDF als Input gemacht (Droplet). Kann man natürlich auf beliebige Endungen abändern.

Probleme dabei waren:
  • die Aktion "New Folder" verschiebt den Input nicht in den Ordner, sondern kopiert ihn, d.h. man muss vorher nen leeren Ordner erstellen und dann die Dateien per Aktion "Move Finder Items" da rein schieben
  • die Variablen für die Ordner kann man nur auf vorhandene Ordner setzen, deswegen muss man die Ordner vorher einmal erstellt haben, um sie auswählen zu können (und der Name in "New Folder" muss übereinstimmen), danach kann man sie wieder löschen (denn sie werden ja sowieso jedes mal neu erstellt)
  • man muss für jede Dateiart eine eigene Variable festlegen, da sonst ein Fehler entsteht, wenn vorhandene Dateien von vorherigen Aktionen schon verschoben wurden
Vielleicht kann man es noch effektiver gestalten oder komplett dynamisch auf die Input-Dateiendungen anwenden? Sobald man nämlich andere Dateiarten drauf droppt, geht es schief. Auch weiß ich nicht, wie es sich bei vielen Dateien verhält, also besser erst mal vorsichtig damit umgehen.

PS: Ich hab das mit dem Lion Automator erstellt, hoffe das lässt sich auch öffnen. :)
 

Hifi

Schöner von Nordhausen
Registriert
10.06.04
Beiträge
319
@fyysh, @sedna: Ja, super Service, tausend Dank noch mal! Bei meiner Beschäftigung mit dem Thema war ich auch schon darauf gestoßen, dass ein shell script wohl die schnellere Lösung sei, aber ich hatte mich nicht getraut, danach zu fragen... Und neben AppleScript gleich noch in eine zweite Technik einzusteigen, erschien mir etwas zu viel für den Anfang. ☺

Und jetzt gibts zudem noch eine Automator-Variante, die schaue ich mir natürlich auch noch an.
 

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.359
*grins
Konntest ja mein Vorhaben nicht ahnen. Ausserdem kann man von dir immer was lernen. Also weiter so! :)


@Guy.brush
Zu Problem 2: Für das Ergebnis der Aktion Neuer Ordner kann man eine Variable festlegen und diese später im Workflow einsetzen (z.B. Finder Objekte bewegen)

Gruß