• 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

Große Dateien verschieben

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?
 

Daisy

Uelzener Rambour
Registriert
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
 

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? :-[
 

Daisy

Uelzener Rambour
Registriert
14.01.06
Beiträge
366
zwenn schrieb:
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....

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? :-[

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
 

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
 

Daisy

Uelzener Rambour
Registriert
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
 

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
 

Daisy

Uelzener Rambour
Registriert
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