• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Folder überwachen per Script

Daisy

Uelzener Rambour
Registriert
14.01.06
Beiträge
366
für alle, die's interessiert - dies ist eine Fortführung meines ursprünglich im AppleScript-forum gestarteten Threads - hier:
http://www.apfeltalk.de/forum/folder-actions-abfrageintervall-t29214.html

Nun zu meinem Problem:

Ich möchte mit einem Shellscript einen Folder überwachen (nachschauen ob's neue Files gibt - so ähnlich wie die 'Folder Actions' in AppleScript), in dem laufend Downloads (Gnutella/Limewire) ankommen. Dummerweise kann man aber wohl mit den Standard-Unix-Tools nicht auf das Creation Date der Files zugreifen, sondern nur auf das Modification Date. Wenn ich also in Intervallen die Modification Date der Files mit dem Zeitpunkt des letzten Intervalls abgleiche, kann das schiefgehen, denn das Modification Date ändert sich ja während des Downloads andauernd - dadurch könnte ein File dann mehrmals als neu gemeldet werden, wenn es langsam lädt oder das Intervall zu kurz ist..
Ich müsste mir also entweder immer eine Liste mit allen Files anlegen und das dann später mit dem aktuellen Stand abgleichen (könnte problematisch sein, da sich manchmal sehr viele Dateien in dem Folder befinden) - oder mit 'GetFileInfo -d ...' aus den DevTools arbeiten? Oder gibt's da eine bessere und elegantere Lösung (hoffentlich)?

Vielen Dank für Eure Hilfe :)

Daisy
 

pi26

Adams Parmäne
Registriert
17.12.04
Beiträge
1.297
Ich sehe einfach nicht warum das pur mit AS ein Problem sein sollte, wenn


1. In Perioden der ganze Inhalt des Ordners abgefragt wird
2. Jeweils ein File auf Unbusy überprüft wird (wenn öffnen scheitert)
3. Das Fertige File in einen anderen Ordner verschoben wird

--konzeptionell (ungeprüft)
on idle
tell application "Finder"
set flist to every file of folder "Mac HD01:xy"
repeat with f in flist
--hier versuchen das file zu öffnen, bei misserfolg (offen) ignorieren
move f to folder "Mac HD01:xy_fertig"
end repeat
end tell
return 5 -- in 5 sec wieder
end idle

mfg pi26
 

Daisy

Uelzener Rambour
Registriert
14.01.06
Beiträge
366
Hallo mullzk & pi26,

vielen Dank für eure Tipps :).

Die Idee mit lauchd (kannte ich noch nicht - ich lese mich mal ein ...) - ist sicher brilliant, scheitert aber daran, dass auf dem Rechner, auf dem es laufen soll, momentan noch ein älteres Kätzchen schnurrt. Vielleicht sollte ich den auf Tiger updaten? Ich denke darüber nach ...

Das ganze in AS? Klar dass das geht - aber zwei Dinge stören mich an dem Plan: Erstens würde es mir besser gefallen, wenn der Prozess ganz im Hintergrund läuft - also auch ohne Icon im Dock - und das geht halt nun mal nicht mit AS. Und zweitens habe ich manchmal sehr viele (bis über 1000) Files in dem Folder. Da alle einzeln in einer Scriptschleife abzuarbeiten wäre mir zu aufwändig - dat dauert und kostet Prozessorleistung ... Meine Idee war daher, auf Shellbefehle zurückzugreifen, die mir dann nur eine Liste der neuen Files ausspucken. Ausserdem (sorry, das hatte ich nicht geschrieben) - möchte ich die Files schon während des Downloadvorgangs gemeldet haben und nicht erst wenn sie fertig sind - daher geht das mit dem '--hier versuchen das file zu öffnen, bei misserfolg (offen) ignorieren' leider nicht.
Ich galube aber, ich hatte heute morgen eine Erleuchtung und doch einen Weg gefunden, wie ich mit dem 'Modification Date' zurecht komme - ich melde mich wieder und werde Bericht erstatten.

Vielen Dank noch mal für Eure Hilfe :)

Grüße

Daisy
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
Daisy schrieb:
Wenn ich also in Intervallen die Modification Date der Files mit dem Zeitpunkt des letzten Intervalls abgleiche, kann das schiefgehen, denn das Modification Date ändert sich ja während des Downloads andauernd - dadurch könnte ein File dann mehrmals als neu gemeldet werden, wenn es langsam lädt oder das Intervall zu kurz ist..
Du denkst zu umständlich.
Solange eine Datei heruntergeladen wird, ist sie von einem anderen Prozess geöffnet.

Darüber weiss 'lsof' Bescheid.

Groschen gefallen?
 

atl

Niederhelfenschwiler Beeriapfel
Registriert
04.11.04
Beiträge
842
Genau. Hier eine Empfehlung, wie ich vorgehen würde:
Code:
setze TIMESTAMP=0
while (true) do {
    FILES=finde in zu überwachenden Ordner alle Dateien jünger als TIMESTAMP
    Setze TIMESTAMP auf aktuelle Zeit
    Für alle Dateien in FILES {
        Wenn (test ob Datei geöffnet (mittels lsof) != TRUE) dann
            tue, was du willst mit der Datei
    }
    Warte eine Zeit x
} done
All das funktioniert in der Bash mittels Shell-Scripting unter Verwendung der (externen) Befehle find, lsof, sleep und date. :)

ByE...
 

Daisy

Uelzener Rambour
Registriert
14.01.06
Beiträge
366
Rastafari schrieb:
Du denkst zu umständlich.
Solange eine Datei heruntergeladen wird, ist sie von einem anderen Prozess geöffnet.

Darüber weiss 'lsof' Bescheid.

Groschen gefallen?

Hallo Rastafari & atl,

lsof ist kein schlechter Gedanke - aber lsof fände ja alle Dateien, die LimeWire offen hat - also auch alle, die sich evtl. inaktiv in der Queue befinden - das können auch schon mal viele sein. Wie bereits geschrieben - ich hatte da eine Erleuchtung und die sieht so aus (Skript funktioniert und läuft schon):

Da ich weiss, dass Limewire maximal 8 Files gleichzeitig lädt (mehr stelle ich da nie ein - ich könnte den exakten Wert aber sicher auch noch irgendwie aus einer Preferenz-Datei auslesen, denke ich ...) mache ich einfach:

ls -tvw ...

und schneide mit mit 'head' die 9 obersten (=neuesten) ab:

... | head -n9

Dann habe ich die 8 zuletzt von LimeWire bearbeiteten Files (die neunte ist 'downloads.dat')
Bei nur 8 Files ist es dann kein Problem, nachzuschauen, ob sie bereits bearbeitet wurden, ob sie schon größer als 0 Bytes sind, sie den richtigen Dateityp haben etc. ...

Vielen Dank noch mal Euch allen für Eure Hilfe :)

Daisy
 

stk

Grünapfel
Registriert
05.01.04
Beiträge
7.141
Moin,

Apropos launchd - bin die Tage über Lingon - einer GUI für launchd gestolpert.

Für die Pre-Tigers gibt es mit CronniX ein Pendant für die crontab.

Gruß Stefan