AutomatorでファイルのEOFを確認

SMB共有にフォルダアクションを設定し、自動でFTPサーバにアップするフローを作成したのですが、

容量が大きいファイルですと、途中でアップされてしまいます。

そこでディスカッション内を検索してこのような書き込みを見つけました。

「最初にファイル名を取得、シェルスクリプトでそのファイルの「EOF」を確認し続け、確認後に次の動作を行なうようにしました。

これで、中間ファイルを送ってしまう動作は起きなくなったようです。」


シェルスクリプトでEOFを確認し続ける方法を教えて下さい。

お願いします。

MacBook Pro, Mac OS X v10.7.3 Lion

投稿日 2013/09/29 11:20

返信
返信: 16

2013/09/30 20:22 yos への返信

失礼致します。 フォルダにファイルがコピーされている途中でフォルダアクションが実行されてしまうという状況でしょうか? その場合、


1)delayコマンドでコピーが終了するのに十分な時間を取る。

2)コピーが終了するまで、ファイルサイズが増加し続けるので、これを利用して、info forコマンドでファイルサイズの変化を繰り返し調べて、サイズに変化が無くなった時点でコピー終了と判断し、フォルダアクションを実行する。

3)『コピー中』のウィンドウの有無をチェックして(System Events を使用)、ウィンドウが消えた段階でフォルダアクションを実行する。 → AppleScript GUI scripting website


といった対応になると思います。 如何でしょう?


こんなトピックもありました。 → FTP Dropletの使い方

2013/09/30 21:01 T22T への返信

返信ありがとうございます。

私の無知な頭で考えた、社内での実際の流れを詳しく書きます。

SMB共有のフォルダにフォルダアクションを設定したのですが、

毎日、Macを再起動するたびにフォルダアクションが動作しないので以下の流れを考えました。

SMB共有に他ネットワーク接続の端末からファイルがコピーされると、

フリーソフトのsyncdifferentで私のMacのフォルダに同期されます。

ここでファイル容量が大きいとSMBにコピー完了されていない不完全ファイルが同期。

この同期先のフォルダにフォルダアクションを設定しており、同期されるとそのファイルをWORKフォルダにコピーしてFTP送信してしまいます。

syncdifferentが完全なファイルを同期してもファイルが上書きされるだけなので、フォルダアクションは動きません。

不完全ファイルが送信するのを避けたいのと、ファイルのEOFを確認してからWORKフォルダにコピーできたらと考えています。

追加でお聞きしたいのですが、

私のフォルダアクションでは「指定されたファイルを取得」「フォルダ内容を取得」を設定していないのですが、これらの意味はどういったことなんでしょうか?

これらを設定するとファイルのEOFを見るのでしょうか?


T22T様が教えていただいた1)の時間を取るのは正直さけたいです。※送信を早くしたいので。

2)はsyncdifferentで同期させたファイルなので段階的に上書きされるため無理と思います。

3)は他ネットワークからSMBコピーなのでコピー中のウィンドウが出ないので無理です。

出来れば、追記で教えていただいたコマンドなどを使用する具体的な方法を教えて頂けないでしょうか?

正直、シェルやAppleScriptは殆どわかりません。またAutomatorにどのように設定していいかもわかりません。

よろしくお願いします。

2013/10/01 19:58 yos への返信

失礼致します。


1)Automatorのフォルダアクション Workflowの最初のアクションに、以下の『AppleScriptを実行』アクションを入れてみるとどうでしょうか(ファイルのコピーが終わるまでフォルダのサイズが変化するので、変化しなくなるまで待つスクリプトです)?


on run {input, parameters}



--フォルダアクションを適用しているフォルダを設定

set theFolder to alias "MOUNTAIN LION:Users:UserName:Desktop:Temp:"



--変数を設定

set size_old to 0

set size_new to 1



--フォルダのサイズを1秒毎に調べて、サイズの変化が無くなるまで繰り返す。

repeat until (size_new = size_old)

set size_old to size of (info for theFolder)

delay 1

set size_new to size of (info for theFolder)

end repeat


return input

endrun



set theFolder toの部分はフォルダアクションを適用しているフォルダのエイリアスを、変数(theFolder)に設定しています。 御使用の環境に合わせて変更して下さい。 独特の表記になっているので、記述方法が解らない場合は、AppleScript Editorで、choose folderコマンドを実行して、ダイアログからフォルダを選択したときに返ってくる値をそのままコピーして、貼付けるといいです。


2)get eofコマンドが返す値はファイルのサイズと同じで、参照するオブジェクトがフォルダやパッケージだとエラーになるので、info forコマンドの方が使いやすいです。


3)『syncdifferentが完全なファイルを同期してもファイルが上書きされるだけなので、フォルダアクションは動きません。』との部分が、良く理解できません。 フォルダアクションが動かないとすれば、WORKフォルダにコピーされることもないと思うのですが、いかがでしょう?


4)フォルダアクションに、「指定されたファイルを取得」「フォルダ内容を取得」を設定する必要はないと思います。 「指定されたファイルを取得」アクションは、指定したファイルのエイリアスリストを次のアクションに渡します。 「フォルダ内容を取得」もフィルダ内のファイルやサブフォルダのエイリアスリストを次のアクションに渡します。 これらの機能はフォルダアクションWorkflowが最初に実行する機能と同じで、それも、フォルダに加わったファイルやフォルダのエイリアスリストを、最初のアクションに渡します。

2013/10/02 01:11 T22T への返信

T22T様、返信ありがとうございます!


1)はSMBから私のMacへの同期がsyncdifferentで行っているため、コピー中と認識していないと思います。

先日ファイル容量300MBを同期した際、途中でFTP送信されたため、何度かテストを行いました。

SMBへの格納を目視で確認していたのですが、他端末からSMBへコピーが終わるとSMB共有(Linuxサーバ)に格納されたファイルが段階的にファイル容量が増えていっている感じでした。SMBだからでしょうか…。

その為、私のMacへも段階的にファイルが同期され、syncdifferentのログを見ると3,4回同期していました。

1MB位のファイルですと、当然ですが1回で同期します。

3)に関しては、フォルダアクションを設定しているフォルダにsyncdifferentで一度同期されると、WORKフォルダにコピーされるため、そのフォルダー内のファイルが何度か同期されてもフォルダアクションは動かないということです。

4)は大変参考になりました。ありがとうございます!

出来れば1)のAppleScriptを2)のEOFに変更した記載方法を教えて頂けないでしょうか?

1)も試してみます。本当に助かります。

よろしくお願いします。

2013/10/02 01:27 yos への返信

度々、失礼致します。 少し解らない部分を質問させて下さい。


1)下図のような処理と理解していますが、あっていますでしょうか? また、フォルダアクションを設定しているフォルダは、下図の『Macのフォルダ』と『WORKフォルダ』のどちらでしょう?

ユーザがアップロードしたファイル

2)フォルダアクションの内容はどのようなものでしょう? FTPによるファイルのアップロードのみでしょうか? それとも、WORKフォルダへのコピーも行うものでしょうか?

2013/10/02 01:41 T22T への返信

返信ありがとうございます。

1)その通りです。

2)「Macのフォルダ」にフォルダアクションを設定しています。

「Macのフォルダ」にファイルが追加されると「Finder項目にフィルタを適用」で拡張子を見ます。

そして指定の拡張子であれば「WORKフォルダ」にコピーします。

「WORKフォルダ」にコピーしたファイルのファイル名を英数名に変更させ、

「Upload to FTP」にてサーバにアップしています。

※ファイル名が全角ですとFTP送信が失敗する時があるためファイル名を英数に変換しています。


※ちなみに私のMacは早朝に再起動させ、SMB共有フォルダとWORKフォルダの中身はその際削除する設定にしておりおます。「Macのフォルダ」の中身は手動で不定期に別のストレージに移動させバックアップしています。


よろしくお願いします。

2013/10/02 02:12 yos への返信

御説明を頂きまして、有り難うございました。  私の想像した処理と一致していたので、上記のAppleScriptをフォルダアクションの最初に入れると巧く作動するものと思います。 1秒毎にフォルダのサイズをチェックしますので、次のアクションに移るまで最低でも数秒かかると思います。 試してみて下さい。 get eofコマンドを使ったAppleScriptは後日書き込みます。

2013/10/02 05:18 yos への返信

見当はずれでしたら申し訳ありません(と先に謝っておきます)。


その為、私のMacへも段階的にファイルが同期され、syncdifferentのログを見ると3,4回同期していました。


結局のところ、SyncDifferentのこの挙動が問題ということでいいのでしょうか。

#その後のMacフォルダからWORKフォルダへのコピーおよびFTP転送は、ファイルサイズが大きくコピーに時間がかかっても問題なく動作しているのですよね?

差分コピーするソフトは他にも探せば見つかるように思いますが(すぐ思いつくのはSync!Sync!Sync!)、他のソフトで試してみてもダメでしょうか?

2013/10/02 07:09 HAL への返信

HAL様、返信ありがとうございます。

僕も同期ソフトを変えようと思いましたが、

多分同じ同期になると思います。

ファイルのEOFを確認後に同期してくれるソフトならいいのですが。

お教え頂いたソフトも試してみます。

ありがとうございます。

2013/10/02 20:01 yos への返信

失礼致します。


1)EOFの確認方法について、シェルスクリプトとAppleScriptとを混同していました。済みません。 最初の投稿で引用なさっていたのは、『シェルスクリプトでそのファイルの「EOF」を確認』となっていますので、これは、シェルスクリプトとなっているので、おそらく、UNIXのコマンドかプログラミング言語を使った処理になると思います。 具体的な方法については、申し訳ありませんが、私には解りません。


2)複数ファイルがSMB共有フォルダにコピーされた場合や、sync-differentがサイズの大きなファイルに対して繰り返し同期を行った場合でも、同期されるファイルが入っているフォルダのサイズは変化し続けるものと思います。 なので、フォルダサイズが変化しなくなるまで待つ処理があれば、中間ファイルをコピーすることもなく、FTPでアップロードすることもないものと考えます。

このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

AutomatorでファイルのEOFを確認

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。