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
Ergebnis 1 bis 10 von 16
- 01.12.2011, 13:51 #1Riesenboiken
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)
- 01.12.2011, 15:24 #2Riesenboiken
Themenstarter
- Registriert
- 06.2004
- Beiträge
- 290
- 01.12.2011, 22:41 #3
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ß
- 01.12.2011, 23:42 #4Riesenboiken
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.
- 02.12.2011, 12:01 #5
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
- 02.12.2011, 16:30 #6Riesenboiken
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.
- 02.12.2011, 18:29 #7
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 mvFiles2DestThe cause of the problem is:
Don't worry; it's been deprecated.
The new one is worse.
- 02.12.2011, 18:53 #8Riesenboiken
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"?
- 02.12.2011, 19:02 #9
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.
- 02.12.2011, 19:18 #10Riesenboiken
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.


Zitieren
