Fischer-Bayern.de
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Rekursives bearbeiten dauert zu lange

 
Neues Thema eröffnen   Neue Antwort erstellen    Fischer-Bayern.de Foren-Übersicht -> AppleScript X
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
kipp
•-->
•-->


Anmeldedatum: 27.03.2007
Beiträge: 73
Wohnort: Göttingen

BeitragVerfasst am: 06.06.2013 - 10:29    Titel: Rekursives bearbeiten dauert zu lange Antworten mit Zitat

Hallo in die Runde,

ich habe mir ein Skript zusammengestellt, mit dem ich unsere bis zu 6 GB (und mehr) großen Ordner etwas entschlacken möchte. Applescript löscht hier alle ungewünschten BMP-Dateien und komprimiert DXF- und DWG-Dateien. Das läuft bei kleineren Testläufen so weit ganz gut, dauert bei den großen Ordnern aber eine halbe Ewigkeit (habe deshalb den Timeout sehr hoch angesetzt).

Gibt es eine Möglichkeit, die Routinen in Applescript zu beschleunigen, oder macht es da Sinn, ggf. auf Perl (davon habe ich nach wie vor kaum Ahnung) oder etwas anderes umzusteigen?

Hier der Code:

Code:


on open theFileList
   set InternList to theFileList
   
   tell application "Finder"
      
      with timeout of 6000 seconds
         
         -- BMP-Dateien löschen
         
         set f to (files of entire contents of folder theFileList whose name extension is "bmp") as alias list
         repeat with aFile in f
            delete aFile
         end repeat
         
         -- DWG und DXF Dateien zippen
         
         set f to (files of entire contents of folder theFileList whose name extension is "dwg" or name extension is "dxf") as alias list
         repeat with aFile in f
            set theItem to aFile as alias
            set itemPath to quoted form of POSIX path of aFile
            set fileName to name of aFile
            set theFolder to POSIX path of (container of theItem as alias)
            set zipFile to quoted form of (theFolder & fileName & ".zip")
            do shell script "zip -r " & zipFile & " " & itemPath
            delete aFile
         end repeat
         
      end timeout
      
   end tell
   
end open



Sommersonnige Grüße,
>>> kipp ;-)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jürgen
•->
•->


Anmeldedatum: 09.07.2012
Beiträge: 15
Wohnort: Langenfeld

BeitragVerfasst am: 06.06.2013 - 14:21    Titel: Antworten mit Zitat

Hallo kipp,

keine Ahnung, wie lange das zip braucht, weil das von der Menge der Dateien abhängt. »do shell script« ist auch nicht gerade ein Ausbund an Speed. Mein Tipp ist aber, dass »entire contents« im Finder der wichtigste Zeitfresser ist. Hängt aber auch von der Menge der Dateien im Ordner ab. Hier ein paar Tests:

Rechner: Mac mini, 2,3 GHz Intel Core i5
System 10.8.3

Script 1

Code:
set x to path to documents folder
with timeout of 6000 seconds
   tell application "Finder"
      set l to (entire contents of x)
   end tell
end timeout
l


nach gut einer Stunde gewaltsam abgebrochen.

Folgendes Python-Script, das die Liste der Dateipfade als plist abliefert, braucht ungefähr 15 Sekunden in BBEdit (in der Shell ist es schneller):

Code:
#!/usr/bin/python

import os, sys, plistlib
p = sys.argv[1]
l = []
for root, directorypath, files in os.walk(p):
   for fn in files:
      (n,e) = os.path.splitext(fn)
      if e in (".rtd",".rtt"):
         l += [os.path.join(root.decode("utf_8"),fn.decode("utf_8"))]
print plistlib.writePlistToString(l)


(Achtung: Einrückungen haben in Python eine Bedeutung!)

Die plist hat den Vorteil, dass man sie mit System Events wieder auseinander nehmen dann. Bei der Menge, die in meinem User-Folder rumliegt, bricht das allerdings wieder zusammen.

Ich habe dann einen Filter ergänzt, der knapp 600 Dateien übrig lässt. (Bei mir waren es nicht die Endungen .dwg und .dxf, aber das ist natürlich egal.) Damit war ich per AppleScript wieder auf rund 15 Sekunden:

Script 3:

Code:
set py_script to quoted form of ¬
   "import os, sys, plistlib
p = sys.argv[1]
l = []
for root, directorypath, files in os.walk(p):
   for fn in files:
      (n,e) = os.path.splitext(fn)
      if e in (\".dwg\",\".dxf\"):
         l += [os.path.join(root.decode(\"utf_8\"),fn.decode(\"utf_8\"))]
print plistlib.writePlistToString(l)"

set f to path to documents folder
set arg to quoted form of POSIX path of f

with timeout of 300 seconds
   set pl to (do shell script "python -c " & py_script & " " & arg)
   
   tell application "System Events"
      set pl_i to (make new property list item with properties {text:pl})
      set r to value of pl_i
   end tell
end timeout
r



OK, Script 3 liefert eine Liste von UNIX-Pfaden und keine Aliase. Aber in dem zip-Teil werden die sowieso gebraucht.

(Ich habe Python statt Perl genommen, weil a. beim Verknoten mit AppleScript die plistlib saupraktisch ist, und mir b. der Masochismus fehlt, Perl zu lernen.)

Gruß, Jürgen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
kipp
•-->
•-->


Anmeldedatum: 27.03.2007
Beiträge: 73
Wohnort: Göttingen

BeitragVerfasst am: 06.06.2013 - 16:48    Titel: Antworten mit Zitat

Hallo Jürgen,

das schaut für mich als einfachen c&p-Skripter alles überaus beindruckend aus ! Jetzt muss ich nur noch schauen, wie ich was mit der Dateiliste anfange, die da am Ende herauskommt ;-)

Gestatte mir bitte eine kurze Rückfrage: Ich wollte ja gerne Dateien eines (bzw. mehrerer) Dateitypus löschen und die DXF- und DWG-Dateien erst komprimieren und die Originale dann ebenfalls löschen. Bedeutet das, dass ich mir die via Python generierte Liste zwei mal in das Skript einbaue (also für jede Dateigruppe mit der ich etwas anstellen will ein mal), oder gibt es eine Möglichkeit das miteinander zu kombinieren, damit ich meine Verzeichnisse nicht zwei mal nacheinander mit Python durchforsten muss?

viele Grüße,
>>> kipp ;-)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jürgen
•->
•->


Anmeldedatum: 09.07.2012
Beiträge: 15
Wohnort: Langenfeld

BeitragVerfasst am: 06.06.2013 - 17:23    Titel: Ein Handler Antworten mit Zitat

Hallo kipp,

ich wollte vor allem sehen, ob meine Annahme stimmt, dass die Finder-Abfrage die Zeit frisst, du also

Code:
set f to (files of entire contents of folder theFileList whose name extension is "dwg" or name extension is "dxf") as alias list


einmal ohne das übrige Gelumpe ausprobierst und mit dem Python-Script vergleichst. Vielleicht liege ich ja daneben, das hängt einfach nur von der Menge der Dateien in deinem Ordner ab.

in der Zeile

Code:
if e in (\".dwg\",\".dxf\"):


ist der Teil in runden Klammern die Liste von Extensions, auf die geschaut wird. Hier also: .dwg und .dxf

Es gibt eine kleine Falle, wenn nur eine Extension benutzt werden soll: Es muss dann ein Komma am Ende stehen, wie in »(\".dwg\",)«.

Abgesehen davon hattest du meinen Spieltrieb ausgelöst. Hier ein noch wenig getester Handler, der in einem Rutsch zipped, optional löscht und optional zurückmeldet, über welche Dateien er gelaufen ist:

Code:
on zipfiles(root_dir, extension_list, delete_after, return_list)
   set py_script to quoted form of ¬
      "import os, sys, plistlib, zipfile
pl = sys.argv[1]
args = plistlib.readPlistFromString(pl)
p = args[\"root_dir\"].encode(\"utf_8\")
del_after = args[\"del\"]
e_list = args[\"ext_list\"]
ret_list = args[\"ret_list\"]
l = []
for root, directorypath, files in os.walk(p):
   for fn in files:
      (n,e) = os.path.splitext(fn)
      if e in e_list:
         pf = os.path.join(root,fn)
         os.chdir(root)
         zf = zipfile.ZipFile(fn + \".zip\", \"w\")
         zf.write(fn)
         if del_after:
            try:
               os.remove(pf)
            except:
               pass
         if ret_list:
            l += [os.path.join(root.decode(\"utf_8\"),fn.decode(\"utf_8\"))]
if ret_list:
   print plistlib.writePlistToString(l)"
   
   set root_d to POSIX path of root_dir
   set arg_record to {root_dir:root_d, ext_list:extension_list, del:delete_after, ret_list:return_list}
   tell application "System Events"
      set pl_i to (make new property list item with properties {value:arg_record})
      set args to text of pl_i
   end tell
   set args to quoted form of args
   with timeout of 300 seconds
      set pl to (do shell script "python -c " & py_script & " " & args)
      set r to ""
      if return_list then
         tell application "System Events"
            set pl_i to (make new property list item with properties {text:pl})
            set r to value of pl_i
         end tell
      end if
   end timeout
   return r
end zipfiles


set p to choose folder
zipfiles(p, {".dwg", ".dxf"}, true, false)


Die Argumente sind in der Reihenfolge:
- Ordner, der abgeklappert werden soll (Typ: Alias)
- Liste mit den Endungen (inklusive Punkt) (Typ: Liste)
- soll anschließend das Original gekillt werden (Typ: boolean)
- soll eine Liste der bearbeiteten Dateien zurück kommen (Typ: boolean)

Gruß, Jürgen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
kipp
•-->
•-->


Anmeldedatum: 27.03.2007
Beiträge: 73
Wohnort: Göttingen

BeitragVerfasst am: 06.06.2013 - 20:24    Titel: Antworten mit Zitat

Hallo Jürgen,

ja, Deine Annahme stimmt. Ich habe zwei kleine Droplets gebastelt und das an einem ca. 800 MB großen Verzeichnis getestet. Das Applescript hat ca 5 bis 6 Sekunden gebraucht, bevor eine Ergebnisliste angezeigt wurde. Python hat die Liste quasi sofort ausgeworfen. Beeindruckender Unterschied !

Hier die beiden Skripte - Applescript:

Code:


on open theFileList
   tell application "Finder"
      
      with timeout of 6000 seconds
         
         set f to (files of entire contents of folder theFileList whose name extension is "dwg" or name extension is "bpn") as alias list
         display dialog f
         
      end timeout
      
   end tell
end open



und Python:

Code:


on open theFileList
   tell application "Finder"
      
      set py_script to quoted form of ¬
         "import os, sys, plistlib
p = sys.argv[1]
l = []
for root, directorypath, files in os.walk(p):
   for fn in files:
      (n,e) = os.path.splitext(fn)
      if e in (\".dwg\",\".dxf\"):
         l += [os.path.join(root.decode(\"utf_8\"),fn.decode(\"utf_8\"))]
print plistlib.writePlistToString(l)"
      
      set f to theFileList
      set arg to quoted form of POSIX path of f
      
      with timeout of 300 seconds
         set pl to (do shell script "python -c " & py_script & " " & arg)
         
         tell application "System Events"
            set pl_i to (make new property list item with properties {text:pl})
            set r to value of pl_i
            set r to r as string
         end tell
      end timeout
      
      display dialog r
      
   end tell
end open



Ich hätte Deinen neuen Handler gerne gleich ausprobiert, verstehe das Skript aber nicht mehr und möchte diverse DWG-Dateien auf der Platte noch behalten ;-) Verstehe ich das richtig, dass Du mit root_dir mein Home-Verzeichnis abfragst? Eigentlich wollte ich ja ein Droplet basteln, in dem nur die Dateien des auf das Droplet gezogenen Ordners abgearbeitet werden. Mit Deinem ersten Ansatz habe ich es hinbekommen, mir mit dem Droplet eine Liste auswerfen zu lassen - aber bei dem neuen Ansatz verlassen mich die Programmiergötter bereits ...

>>> kipp ;-/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jürgen
•->
•->


Anmeldedatum: 09.07.2012
Beiträge: 15
Wohnort: Langenfeld

BeitragVerfasst am: 06.06.2013 - 22:21    Titel: Viele Kommentare Antworten mit Zitat

Hallo klipp,

das Script beackert den Ordner, den du im ersten Argument übergibst und keinen von mir festgelegten. Zum Testen duplizierst du deinen Ordner (dauert hoffentlich nicht zu lange), lässt das »choose folder« im Aufruf vom Handler stehen und probierst es mit der Ordnerkopie aus. Dann kann nicht viel passieren.

Im Übrigen: Wenn das dritte Argument auf »false« steht, wird nicht gelöscht. Die Originaldateien bleiben stehen und du kannst das Script mehrfach testen. Die .zip-Dateien werden dann überschrieben.

Ausprobieren sollte also ohne viel Risiko möglich sein.

Falls du das Python-Script nachvollziehen willst, habe ich eine Fassung mit sehr vielen Kommentaren geschrieben, auch, wenn das in der Länge für ein AppleScript-Forum grenzwertig ist.

Es ist reines Python. die ganzen »\"«, die in AS nötig sind, wenn im Python-Script ein »"« steht, habe ich weggenommen. Also zum Beispiel: »p = args["root_dir"].encode("utf_8")« statt »p = args[\"root_dir\"].encode(\"utf_8\")«.

Mit den Kommentaren sieht das dann so aus:

Code:
# Wie viele Scriptsprachen ist
# Python sehr modular und ich muss
# ein paar Module laden, damit alles
# klappt:
import os, sys, plistlib, zipfile

# do shell script ruft das Python-Script
# mit einem Argument auf, einer plist,
# die vorher System Events erzeugt hat.
# Dieser Text wird in der folgenden Zeile in pl
# abgelegt. pl ist dann der Text mit der plist.
# Die plist repräsentiert einen AS record.
pl = sys.argv[1]

# Die plist wird in der folgenden Zeile
# zu einer Python-Datenstruktur:
# einem dict, dem Analogon zu einem AS record.
args = plistlib.readPlistFromString(pl)

# Aus dem dict wird der Wert »root_dir«
# ausgelesen und in p gelegt.
# Das ist das Verzeichnis, das
# abgearbeitet werden soll.
# Der Name »root_dir« stammt aus dem record,
# der in AppleScript angelegt wird:
# »set arg_record to {root_dir:root_d, ext_list:extension_list,...}«
p = args["root_dir"].encode("utf_8")

# in del_after wird abgelegt, ob bearbeitete
# Dateien anschließend gelöscht werden sollen.
del_after = args["del"]

# In e_list wird abgelegt, welche Extensions
# interessieren (eine Liste, analog zu AS list).
e_list = args["ext_list"]

# In ret_list wird abgelegt, ob eine Liste
# der bearbeiteten Dateien zurückgeliefert werden
# soll.
ret_list = args["ret_list"]

# l ist die ggf. benutzte Ergebnisliste
# mit den Dateien und wird als leerer Array
# (= Liste) initialisiert.
l = []

# os.walk klappert den Ordner ab, der in Klammern
# steht. Der Punkt entspricht den AS »of«, aber in
# umgekehrter Reihenfolge. »os.walk« ist in AS
# Analogie: »walk of os«. »os« ist eines der importierten
# Module.

# Die »for«-Schleife liefert für jedes Verzeichnis drei
# Werte ab: Pfad zum aktuellen Verzeichnis,
# Pfade zu den Ordnern im Verzeichnis (Array aka Liste),
# Pfade zu Dateien im Verzeichnis (wieder Array aka Liste).
# Die Zuweisung zu »root, directorypath, files«
# funktioniert analog zu AS
# set {x,y,z} to {"abc",{1,2,3},{4,5,6,7}}
for root, directorypath, files in os.walk(p):
   # Untergeordnete Zeilen (wie in einem repeat oder tell in AS)
   # müssen eingerückt sein.
   # fn ist eine Liste, deshalb die nächste for-Schleife
   for fn in files:
   
      # Der aktuelle Dateiname wird in Namen und Extension
      # geteilt. Die Funktion steckt in »path« von Modul »os«.
      # Again: Das wäre in AS-Syntax etwas wie:
      # »splitext(fn) of path of os«
      # e ist dann die Extension
      (n,e) = os.path.splitext(fn)
     
      # Check, ob die Extension in der Liste steht, die als
      # »e_list« übergeben wurde
      if e in e_list:
     
         # Bastel den Pfad zum gerade beackerten
         # Unterordner mit dem Dateinamen zusammen
         # und lege das Ergebnis in pf ab
         pf = os.path.join(root,fn)
         
         # Wechsle das aktuelle Verzeichnis (»UNIX working directory)
         # auf das gerade bearbeitete.
         # Wenn man das nicht macht, kommen auch .zip-Dateien
         # heraus, aber sie enthalten ganze Ordnerstrukturen.
         os.chdir(root)
         
         # Hier die erste Objekt-Struktur, vergleichbar einem in AS
         # mit »script« angelegten Objekt.
         # zf wird als ZipFile des Moduls zipfile angelegt,
         # mit dem Pfad der gerade aktuellen Datei plus ».zip« und Schreibberechtigung
         # (das »"w"« im zweiten Argument)
         zf = zipfile.ZipFile(fn + ".zip", "w")
         
         # Dem Objekt zf wird erzählt, dass es ausgehend von der Datei mit
         # dem Namen »fn« ein Archiv schreiben soll.
         zf.write(fn)
         # An dieser Stelle ist das jeweilige zip-Archiv fertig.
         
         # Wenn »del_after« true ist (es soll das Original gelöscht werden),
         # dann folgender Code:
         if del_after:
            # Versuche, pf zu löschen. Wenn das scheitert,
            # (ist mir gleich im ersten Versuch wegen einer geschützten
            # Datei passiert), dann tue nichts (»pass«). Das »except« entspricht
            einem »on error« in AS. In Python darf es aber nicht fehlen.
            try:
               os.remove(pf)
            except:
               pass
           
            # Wenn »ret_list« true ist, dann hänge den kompletten Pfad zur
            # gerade bearbeiteten Datei an l an.
            # Das ungewohnteste für AS-Benutzer hier: Python kennt zwei Arten
            # von Strings: Byte-Strings (Binärstrings) und Buchstaben-Strings
            # (Unicode Strings). root und fn liegen an dieser Stelle als Byte-
            # Strings vor, die als UTF 8 gemeint sind. Mit »decode« müssen sie
            # zu Unicode Strings gemacht werden. »join« von path in os hängt Teile
            # zusammen und kümmert sich dabei um die Details, wie das für Pfade nötig ist.
         if ret_list:
            l += [os.path.join(root.decode("utf_8"),fn.decode("utf_8"))]

# Wenn ret_list true ist (bearbeitete Dateien sollen als Liste zurück kommen),
# dann mache mit »writePlistToString« von »plistlib« aus der Liste l eine plist.
# Gib sie mit »print« an »do shell script« zurück.
if ret_list:
   print plistlib.writePlistToString(l)


Gruß, Jürgen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
kipp
•-->
•-->


Anmeldedatum: 27.03.2007
Beiträge: 73
Wohnort: Göttingen

BeitragVerfasst am: 06.06.2013 - 23:11    Titel: Wahnsinn Antworten mit Zitat

Hallo Jürgen,

Wahnsinn - bin wirklich ein wenig sprachlos !
An dieser Stelle erst einmal einen herzlichen Dank für Dein Engagement !

Ich habe versucht, den Teil komplett zu verstehen - klappt ansatzweise - aber wie man so etwas schreiben kann, das will einfach nicht in meinen Kopf ;-) Funktioniert aber wie Du es gesagt hast. Und als mir klar geworden ist, dass die Argumente im letzten Teil des AS stehen, war es auf einmal ziemlich logisch!

Gibt es bei dem Handler eine Möglichkeit, den zweiten Teil meiner Idee ("lösche alle BMP-Dateien in der Ordnerstruktur") einzubeziehen? Ich habe spaßeshalber ein wenig herumexperimentiert und bin zu dieser Zwischenlösung gekommen:

Code:


set p to choose folder
zipfiles(p, {".dwg", ".dxf"}, true, false)
zipfiles(p, {".bmp"}, true, true)



Allerdings werden die BMP-Dateien da natürlich ebenfalls erst gezippt und dann gelöscht. Nur brauche ich die ZIP-Dateien gar nicht, sondern will die BMP-Dateien gleich ganz und gar restlos löschen.

nächtliche Grüße,
>>>kipp ;-)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jürgen
•->
•->


Anmeldedatum: 09.07.2012
Beiträge: 15
Wohnort: Langenfeld

BeitragVerfasst am: 06.06.2013 - 23:28    Titel: Löschen Antworten mit Zitat

Variante des Handlers, bei dem einfach die Anweisungen zum Zippen fehlen:

Code:
on deletefiles(root_dir, extension_list, return_list)
   set py_script to quoted form of ¬
      "import os, sys, plistlib
pl = sys.argv[1]
args = plistlib.readPlistFromString(pl)
p = args[\"root_dir\"].encode(\"utf_8\")
e_list = args[\"ext_list\"]
ret_list = args[\"ret_list\"]
l = []
for root, directorypath, files in os.walk(p):
   for fn in files:
      (n,e) = os.path.splitext(fn)
      if e in e_list:
         pf = os.path.join(root,fn)
         try:
            os.remove(pf)
         except:
            pass
         if ret_list:
            l += [os.path.join(root.decode(\"utf_8\"),fn.decode(\"utf_8\"))]
if ret_list:
   print plistlib.writePlistToString(l)"
   
   set root_d to POSIX path of root_dir
   set arg_record to {root_dir:root_d, ext_list:extension_list, ret_list:return_list}
   tell application "System Events"
      set pl_i to (make new property list item with properties {value:arg_record})
      set args to text of pl_i
   end tell
   set args to quoted form of args
   with timeout of 300 seconds
      set pl to (do shell script "python -c " & py_script & " " & args)
      set r to ""
      if return_list then
         tell application "System Events"
            set pl_i to (make new property list item with properties {text:pl})
            set r to value of pl_i
         end tell
      end if
   end timeout
   return r
end deletefiles
set p to choose folder
deletefiles(p, {".bmp"}, false)


Der hat natürlich nur noch drei Argumente (»Löschen« einstellbar zu machen, wenn der Zweck löschen ist, wäre schon blöd.)

Nur Löschen geht sicher auch einfacher, aber aus dem bestehenden Handler nur das zu entfernen, was mit zippen zu tun hat, ging jetzt am schnellsten.

Achtung: Endungen beachten Groß- / Kleinschreibung. Wenn auch ».BMP« vorkommt, muss der Aufruf »deletefiles(p, {".bmp", ".BMP"}, false)« lauten. (Gilt auch für den zip-Handler.)

Gruß, Jürgen

Habe nur drei Tests gemacht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jürgen
•->
•->


Anmeldedatum: 09.07.2012
Beiträge: 15
Wohnort: Langenfeld

BeitragVerfasst am: 07.06.2013 - 00:09    Titel: Etwas Background Antworten mit Zitat

Ich muss noch mal ein bisschen Werbung für das Konzept machen, und weshalb ich hier Python als Tool der Wahl empfinde.

Das ganze hat mit Problemen bei Mac Formateinstellungen zu tun. Ich konzentriere mich hier auf Zahlen, bei Listen etc. gibt es aber ähnlich wichtige Nerveffekte.

Code:
123.456 as text


liefert »"123,456"«, wenn das Script mit deutschen Formateinstellungen läuft. Läuft das Script auf einem Mac mit britischen Einstellungen, kommt "123.456" heraus, also Dezimalpunkt statt -komma.

Ägyptische Einstellungen liefern "١٢٣٫٤٥٦" (mit arabischem Dezimaltrenner) und Hindi-Einstellungen "१२३.४५६".

Das kann einen als Scripter wahnsinnig machen, wenn man mit »do shell script« arbeitet und die Umgebung zur Laufzeit nicht unter Kontrolle hat.

Property Lists sind eine einstellungsneutrale Repräsentation, die Texte, Zahlen, Wahrheitswerte, Kalenderdaten, Listen und Records beherrscht. (Kalenderdaten sind übrigens im Property Lists immer UTC. AppleScript konvertiert die Zeitzone korrekt und auch in Python kommt das entsprechende datetime-Objekt an.)

Mit der Property List Suite von System Events und der plistlib von Python können beide Sprachen zwischen den jeweils eigenen Datentypen und einer Property List hin und her konvertieren.

Damit hat man ein richtig gutes Austauschformat, mit dem man Argumente in ein Python-Script hinein füttern und die Resultate sauber abholen kann.

Gruß, Jürgen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1068

BeitragVerfasst am: 09.06.2013 - 18:02    Titel: Antworten mit Zitat

Eigentlich braucht's da doch kein großartiges scripting.

Terminal öffnen und das hier (alles in einer Zeile!) eingeben:

Code:

find /Mein/Start/Verzeichnis
     -name \*.bmp -exec echo rm "{}" \;
  -o -name \*.dwg -exec echo zip -rm "{}".zip "{}" \;
  -o -name \*.dxf -exec echo zip -rm "{}".zip "{}" \;


Das ist nur ein TEST! Die 3 "echo" weglassen, wenn man das ausführen lassen will!
_________________
"All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies")
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
kipp
•-->
•-->


Anmeldedatum: 27.03.2007
Beiträge: 73
Wohnort: Göttingen

BeitragVerfasst am: 09.06.2013 - 21:29    Titel: Klappt ! Antworten mit Zitat

Hallo Jürgen,

Ich habe die Teile wie von Dir beschrieben zusammengefügt, noch mit einer kleinen Abfrage versehen und ein paar mal getestet. Klappt alles wunderbar! Bei einem 4,5 GB großen Ordner hat das Skript ganze 11 Sekunden benötigt - mein eigenes Applescript musste ich zwei mal gewaltsam nach einer halben bzw. nach einer Stunde abbrechen. Das Ist ein ordentlicher Fortschritt ;-)

Hallo Skeeve,

In der Kürze liegt die Würze, oder? Bin (mal wieder) sehr beeindruckt ;-) Über das Terminal funktioniert das auch super. Leider habe ich es nicht in ein AS eingebunden bekommen (hatte ich wegen der einfacheren späteren Handhabung vor) - die " und ' wollten einfach nicht so wie ich das wollte...


Einen schönen Sonntagabend noch,
>>> kipp ;-)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1068

BeitragVerfasst am: 12.06.2013 - 06:45    Titel: Antworten mit Zitat

Ich bin mir im Moment gar nicht mal sicher, ob die " um fas {} überhaupt Wirkung haben.

Solange die Dateinamen keine "gefährlichen" Zeichen enthalten, werden sie eh nicht gebraucht.

Wenn's um "doshell script", die " und ' geht ist bei AppleScript "quoted form of" immer sehr hilfreich.
_________________
"All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies")
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
tjm
•->
•->


Anmeldedatum: 13.06.2013
Beiträge: 1
Wohnort: Köln

BeitragVerfasst am: 13.06.2013 - 20:48    Titel: Antworten mit Zitat

Die -j Funktion hinzugefügt. So werden keine Ordnerhierarchien im Archiv angelegt. Ist wirklich schnell und per do shell script leicht zu verwenden.

Code:
find /home/tjm/Bilder -name \*.jpg -exec zip -rm "{}".zip "{}" \; -o -name \*.JPG -exec zip -rm "{}".zip "{}" \; -o -name \*.png -exec zip -rm "{}".zip "{}" \;"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Fischer-Bayern.de Foren-Übersicht -> AppleScript X Alle Zeiten sind GMT + 2 Stunden
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2002 phpBB Group
Deutsche Übersetzung von phpBB.de


AppleScript für absolute Starter