1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Große Dateien verschieben

Dieses Thema im Forum "AppleScript" wurde erstellt von zwenn, 17.02.06.

  1. zwenn

    zwenn Gast

    Hallo,

    ich würde gerne mit einer Ordneraktion oder Automator Programm oder sonst irgendwie einen Ordner auf einem anderen Server überwachen. Wenn etwas in den Ordner kopiert wird soll die Datei, nachdem sie vollständig im Ordner vorhanden ist, in einen anderen Ordner verschoben werden.

    Ich habe schon sämtliche Möglichkeiten durchprobiert.

    Mein Problem ist aber immer, ob nun per Automator -> Ordnerinhalt abfragen
    AppleScript -> on adding folder items to this_folder after receiving added_items
    SSH, FTP, WebDAV die Dateien werden schon erkannt und verschoben bevor sie vollständig kopiert worden sind. Es wird also nur ein Bruchteil der Datei verschoben.

    Hat jemand eine Idee wie ich dem Herr werden könnte?
     
  2. Daisy

    Daisy Uelzener Rambour

    Dabei seit:
    14.01.06
    Beiträge:
    366
    Hi zwenn,

    ein paar Ideen:
    1. Idee wäre, in einer Schleife immer wieder die Größe der Datei zu ermitteln und erst dann zu verschieben, wenn sich's nicht mehr ändert. Hmm - könnte vielleicht trotzdem mal schiefgehen, wenn z.B. ein FTP-Tranfer hängt ..

    Ansonsten - irgendein Prozess müsste die Datei ja zum Schreiben geöffnet haben - vielleicht könnte man ja mal probieren, ob man die Datei zum Schreiben öffnen kann? Falls das während des Downloads schiefgeht, dann hättest du ein Kriterium für ein "on error ..."

    Letzte Idee: Hat auch damit zu tun, dass die Datei geöffnet ist: frage lsof:

    wenn lsof | grep <Dateinname> nix ergibt, dann kannst du verschieben.

    Ich hoffe, etwas davon hilft dir ...

    Grüße,

    Daisy
     
  3. zwenn

    zwenn Gast

    Hi,

    vielen Dank für die schnelle Antwort ;o)

    Ich habe mich für einen AppleScript-Aufruf aus dem Automator entschieden, der wie folgt aussieht.

    Code:
    on run {input, parameters}
    	
    	tell application "Finder"
    		repeat with theItem in input
    			do shell script "lsof | grep " & theItem
    			
    			 if the result is "" then
    			 move theItem to folder "MacintoshHD:Users:ich:Desktop:PDF-fertig"
    			 end if
    		end repeat
    	end tell
    	
    	return input
    end run
    Leider kann ich das Ergebnis nicht richtig verarbeiten, da
    Code:
    if the result is "" then
    wohl falsch ist.

    Vielleicht könntest du mir dabei noch mal unter die Arme greifen? :-[
     
  4. Daisy

    Daisy Uelzener Rambour

    Dabei seit:
    14.01.06
    Beiträge:
    366
    Moin,

    das Problem scheint mir zu sein, dass dein shell script nicht einen leeren String ("") zurückgibt, sondern einen Fehler ("Der Befehl wurde mit einem Ergebins ungleich Null beendet.") Ich würde also mal versuchen, die if-Abfrage durch ein on error ... zu ersetzen. Dann verschiebt es nur, wenn der Shellbefehl einen String liefert - und sonst tut es eben nix.
    Probier's mal so:

    Code:
    on run {input, parameters}
    	
    	tell application "Finder"
    		repeat with theItem in input
    			try
    				do shell script "lsof | grep " & theItem
    				move theItem to folder "MacintoshHD:Users:ich:Desktop:PDF-fertig"
    			end try
    		end repeat
    	end tell
    	
    	return input
    end run
    Ein anderes Problem könnte allerdings auch sein, dass das lsof leider nicht gerade der schnellste Shellbefehl ist. Wenn du also viele Dateien überwachen musst, würde ich das Intervall in dem Du die Abfrage startest nicht zu klein wählen.

    Ich drücke die Daumen, dass es klappt ;)

    Grüße,

    Daisy
     
  5. zwenn

    zwenn Gast

    Mit try komm ich leider auch nicht weiter :(

    Anscheinend ist schon das ShellScript nicht ganz richtig, denn selbst

    Code:
    do shell script "lsof | grep " & theItem
    display dialog the result
    hat eine Fehlermeldung zur Folge.

    Aus den lsof man pages wird man aber auch nicht so richtig schlau
     
  6. Daisy

    Daisy Uelzener Rambour

    Dabei seit:
    14.01.06
    Beiträge:
    366
    Hi zwenn,

    sorry, ich arbeite leider nie mit Automator, daher hatte ich das auch nocht ausprobiert. Ich nehme aber mal an, dass die Variable theItem eine Pfadangabe in der 'Doppelpunkt'-Schreibweise (alias "Macintosh HD:Users:theUser: Desktop:thefile.xyz") enthält - lsof als UNIX-Befehl liefert seine Ergebnisse aber im POSIX-path-Stil ("/Users/theUser/Desktop/thefile.xyz") - daher kommt das Filtern mit 'grep' zu keinem Erfolg ...

    Ich würde als nächstes mal versuchen, wie folgt zu ändern:

    do shell script "lsof | grep " & quoted form of (POSIX path of theItem)

    Falls das auch nicht geht, müssten wir vielleicht mal einen Automator-Experten zu rate ziehen. Ich habe keine Ahnung - kann man da auch irgendwas loggen, um zu sehen, was mit den Variablen geschieht?
    Die Abfrage an sich sollte funktionieren - bei mir tut's das jedenfalls:
    Ich hab's probiert mit:

    Code:
    set theItem to choose file
    try
    	do shell script "lsof | grep " & quoted form of (POSIX path of theItem)
    	display dialog "Das File ist geöffnet"
    on error
    	display dialog "Das File ist nicht geöffnet"
    end try
    
    Grüße,

    Daisy
     
  7. zwenn

    zwenn Gast

    Hi Daisy,

    vielen Dank für deine Hilfe. Super, dass du immer so schnell antwortest und dich um die Anliegen anderer so kümmerst :)

    Ich war in der Zwischenzeit natürlich auch nicht ganz untätig und habe hier im Forum und bei http://fischer-bayern.de/phpBB2/index.php einiges zu diesem Thema gefunden.

    Letztendlich, denke ich, dass ich folgendes Script benutzen werde.
    Ich habe es in dem anderen Forum gefunden :innocent:, musste es aber noch etwas umstricken damit es im Automator läuft. Es funktioniert super, auch mit riesigen Dateien. Mittels Cronnix werde ich es in regelmäßigen Intervallen aufrufen und die Dateien dann verschieben.

    Code:
    on run {input, parameters}
    	
    	--do for every added item
    	repeat with this_item in input
    		try
    			--process added items one after another 
    			--check if file is growing using UNIX "ls" command 
    			set LastFileSize to -1
    			set isGrowing to true
    			repeat until isGrowing is false
    				set CurrentFileSize to do shell script ("/bin/ls -l " & (quoted form of (POSIX path of (this_item))) & " | /usr/bin/awk '{print $5}'")
    				if CurrentFileSize is equal to LastFileSize then
    					set isGrowing to false
    				else
    					set LastFileSize to CurrentFileSize
    					delay 2
    				end if
    			end repeat
    			
    			--check if file is busy using UNIX "lsof" command 
    			set isbusy to 1
    			repeat until isbusy is 0
    				set isbusy to ((do shell script ("echo `lsof " & (quoted form of (POSIX path of (this_item))) & " | wc -l`")) as integer)
    				if isbusy is not equal to 0 then
    					delay 5
    				end if
    			end repeat
    			
    			tell application "Finder"
    				move this_item to folder "MacintoshHD:Users:hoschi:Desktop:PDF-fertig"
    			end tell
    			
    			--once the script arrives here, the file in question is not growing and is not busy anymore 
    			--this has been tested for all kinds of file sizes (up to 1,2GB) and protocols (FTP, SMB) 
    			--now that the file is ready, begin your processing 
    			--you should check here if the file exists, because the Windows copy process could have been aborted by the user
    		end try
    	end repeat
    	
    	return input
    	
    end run
     
  8. Daisy

    Daisy Uelzener Rambour

    Dabei seit:
    14.01.06
    Beiträge:
    366
    Hi zwenn,

    fischer-bayern ist immer eine gute Quelle ;)
    Das Script sieht in der Tat sehr schlau aus - es benutzt beide oben vorgeschlagenen Methoden und vereint den Vorteil der Größenwachstumsmethode (Schnelligkeit) mit der Zuverlässigkeit der lsof-Methode.
    Werd' ich mir merken - falls ich so was auch mal brauche ... :)

    Grüße,

    Daisy
     

Diese Seite empfehlen