- ベストアンサー
AutomatorのFinder項目のフィルタ適用
- Automatorを使って特定のフォルダを監視しつつ、特定の条件を満たすファイルが作成された時にコピーの処理を実行したい
- 検索したいファイル名は、12時台に作成される「yymmdd12○○○.csv」と、16時台に作成される「yymmdd16○○○.csv」というファイル名
- フィルタの設定では変数を使うことはできないので、他の方法を探しています
- みんなの回答 (13)
- 専門家の回答
質問者が選んだベストアンサー
もっとシンプルにフォルダアクションを # encoding: utf-8 if RUBY_VERSION < %[1.9.0] require %[jcode] $KCODE=%[utf-8] else Encoding.default_external=%[utf-8] end ARGV.each do |f| if File.basename(f)[/^\d{6}(12|16).*lzh$/] abort %[エラーが発生しました] unless system %[open -W -a add_data2 #{f}] # データ登録作業 end end だけでも良さそうですね。 「シェルスクリプトを実行」でシェルを/usr/bin/rubyに。入力の引き渡し方法は「引数として」 これだけで、「指定されたFinder項目を取得」は無しです。 ファイルの取りこぼしがあればadd_data2のドラッグすれば良いので、使うにはこれで十分かも。
その他の回答 (12)
- ki073
- ベストアンサー率77% (491/634)
>エラーの内容は「Stufflt Expanderが予期しない理由で終了しました Stufflt Expanderが不調でしたら、別の方法が有ります。 まずこちらを参考に。AppleScriptにも対応しています。 http://macrunner.blog.fc2.com/blog-entry-54.html ほかにもコマンドからやる方法もありますが、こちらはいろいろインストールしないといけないので、まず上の方法を試してみたください。
お礼
お世話になっております。 ご紹介いただいたアプリは私も最初にインストールして試したのですが、AppleScriptから解凍して、その後にlzhのオリジナルフォルダを削除する機能が使えなかったので、Stufflt Expanderに変更した次第です。 職場のPCではStufflt Expanderでのエラーは一度も起きていないので、やはり私のPCが怪しい気がします。。。 以前も、別のアプリが正常な動きをせずにOSの再インストールをしたらアッサリ解決したことがあります。 まだ購入から数ヶ月なんですけども^^; 代替案までご紹介いただきまして、ありがとうございましたm(_ _)m
- ki073
- ベストアンサー率77% (491/634)
No.10のお礼欄承知しました。 Automatorの場合にはそのままでは条件分岐ができないのでプログラムを分けないとうまくいきません。 まず、最初に作ったプログラム本体(データベースに登録)ですが、フォルダアクションを解除して、アプリケーションとして保存してください。(少なくともOSX 10.9のAutomatorではメニューの変換で可能です) そして、No.1で追加した 1. 指定されたFinder項目を取得 2. フォルダの内容を取得 3.シェルスクリプトを実行 のアクションを削除してください。そうすると質問者さんが最初に作成した状態にになると思います。 アプリケーションとして保存したファイルをここでは仮にadd_data2とします。 次に動作テストしてください。 このadd_data2のアイコンに登録したいlzhファイルをドラッグしてみてください。そうするとプログラムが動きだして、データベースに登録されるはずです。 まずここまで確認してください。 次にもう一つAutomatorで作成します。 No.7で作成したものを変更してもかまいません。次の順番でアクションを並べます。 1. 指定されたFinder項目を取得 ここに2つのフォルダを登録してください。 最初に、lzhファイルやtxtファイルが自動的に登録されるフォルダ 次に データベースに登録された最後のファイルをいれておくフォルダでNo.7での /Users/xxxx/aaaaに相当します。 このフォルダはどこにあっても構いません。登録する順番を間違えないでください。 (「フォルダの内容を取得」は削除してください) 2. 「シェルスクリプトを実行」 でシェルを/usr/bin/rubyに。入力の引き渡し方法は「引数として」これまでと違いますので注意してください。 スクリプトは # encoding: utf-8 if RUBY_VERSION < %[1.9.0] require %[jcode] $KCODE=%[utf-8] else Encoding.default_external=%[utf-8] end require %[fileutils] source_files=Dir.chdir(ARGV[0]){Dir.glob(%[*.lzh])}.select{|f| f[/^\d{6}(12|16)/]}.sort # 登録対象となるファイル last_finished_file=Dir.chdir(ARGV[1]){Dir.glob(%[*.lzh])}.sort[-1] # 最後に登録したファイル idx=source_files.find_index{|f| f==last_finished_file} # 登録対象となるファイルの中で最後に登録したファイルの位置 copy_files=last_finished_file ? source_files[idx+1..-1] : source_files # 新たに登録するファイル copy_files.each do |f| FileUtils.copy(ARGV[0]+%[/]+f, ARGV[1]) # コピー abort %[エラーが発生しました] unless system %[open -W -a add_data2 #{ARGV[1]}/#{f}] # データ登録作業 end です。 add_data2は先ほどアプリケーションとして保存した名称です。名前を変える時には一致するようにしてください。 これを実行するれば、未登録のものが順次登録されるはずです。基本的にはNo.7と同じ動作のはずです。 動作確認がすめばこちらをフォルダアクションとして設定してください。 ファイルが入っているフォルダはこちらこちらだけで指定し、add_data2は登録するファイル名を渡して実行します。
補足
お世話になっております。 詳しい解説まで付けていただきまして、本当にありがとうございます。 m(_ _)m 教えていただいた順序で作成し、先ほどまで動いていたのですが、急に反応しなくなってしまいました。 再起動もしてみたのですが・・・。 add_data2の方は、アプリケーションとして保存して以下のように設定しました。 1. 変数の値を設定 2. AppleScriptを実行 add_data2のアイコンにlzhファイルをドラッグすると、ちゃんとデータベースにファル名を登録して、lzhファイルは解凍・削除されました。 2つ目のAutomatorは、フォルダアクションとして保存して、 「”フォルダアクション”は、次の場所に追加されたファイルやフォルダを受け取る」という項目には、ネットワークフォルダを指定しました。 あとは、教えていただいたように、 1. 指定されたFinder項目を取得 ネットワークフォルダ ローカルの/Users/xxxx/aaaa の2つを設定 2. シェルスクリプトは教えていただいたものをそのままコピペしました。 ファイル名はadd_dataとして、前のものは削除して、フォルダアクションのフォルダには他には保存されていません。 最初はちゃんと動いていたので、lzhファイルを追加したり、txtファイルを追加してみたり、動きを確認していたのですが、add_data2のAppleScriptの中でlzhファイルを解凍しており、その解凍ソフトの段階で何度もエラーが出ました。 エラーの内容は「Stufflt Expanderが予期しない理由で終了しました」というもので、lzhファイルをコピーするところまではいくのですが、解凍と解凍後のlzhファイルの削除ができません。 それと、私の環境の問題かも知れませんが、lzh以外のファイルが追加された時、何も起きない場合と、1つ前のlzhファイルで処理を最後までしようとして、ファイル名が重複してエラーが起きることもありました。 もうちょっと試してみて、状況を見極めなくてはと思います。 取り急ぎ、ご報告をさせていただきました。 よろしくお願いいたします。 m(_ _)m
- ki073
- ベストアンサー率77% (491/634)
No.6の補足欄について まだ理解できていないところがあるのですが、 >Automatorのフォルダアクションはカレンダーのイベントに登録しなくても、ワークフローとして作成保存した時点で有効になるんですね。 フォルダアクションは使った事がないのですが、ネットワーク上のフォルダでも動くのでしょうか?(半分独り言です) >現状では、関係のないtxtファイルが作成された場合でも毎回処理に入ってしまうので、目的のファイルが作成された時だけに限定をしたいです。 txtファイルが作成されたきには前のファイルをもう一度二重に処理されませんか? なにか二重に処理されないようにそちらでプログラムを追加しているのでしょうか? いずれにしても、No.7の方法だと関係のないtxtファイルが作成された場合には直ぐに終了しますので、影響はないと思います。 書き換え中ですのでNo.7を使うのはしばらくお待ちください。動くことは動くとは思いますが。
お礼
ki073様 お世話になっております。 お忙しい中、何度もご回答いただきまして本当にありがとうございます。 > フォルダアクションは使った事がないのですが、ネットワーク上のフォルダでも動くのでしょうか?(半分独り言です) はい、動いております。 > txtファイルが作成されたきには前のファイルをもう一度二重に処理されませんか? なにか二重に処理されないようにそちらでプログラムを追加しているのでしょうか? はい、最後のlzhフォルダで二重に処理されています。 二重に処理をされないプログラムは、まっっったく方法がわからないので、追加はしていません。 教えていただいたNo.7の方法を昨夜と今日で何度か挑戦しているのですが、こちらではエラーとなってしまいまだ結果を見ることができていません。 ネットでエラーの内容などを調べてはいるのですが、どうにもわからなくてお手上げになりましたら、またエラーの内容を相談させて下さい。 > いずれにしても、No.7の方法だと関係のないtxtファイルが作成された場合には直ぐに終了しますので、影響はないと思います。 ありがとうございます! その動作はまさに理想です! 貴重なお時間を割いてプログラムを作っていただきまして、本当に感謝しております。 ありがとうございますm(_ _)m
- ki073
- ベストアンサー率77% (491/634)
No.7のプログラムは急ごしらえなので、メンテナンスもできないようなぐちゃぐちゃになっています。 すっきりして、分かりやすいプログラムに書き換えがほぼできました、夜にでも書き込みますのでお待ちください。
- ki073
- ベストアンサー率77% (491/634)
書き忘れました /Users/xxxx/aaaa が空っぽだったら、対象となる全部のファイルを登録しようとしますので、少し前のファイルを最低一個入れておいてください。 その次の時間のファイルから順番に登録していきます。
- ki073
- ベストアンサー率77% (491/634)
No.6のどの場合にも対応できるものを作ってみました。 どのファイルを登録したか覚えておく必要がありますので、登録済みのファイルをためておき、その中で日時が一番最後のファイルの次から新たに登録するようにしました。 実際には2つのAutomatorファイルで動かします。 1) Macの適当な場所に登録済みのファイルを置いておくフォルダを作成してください。 これを/Users/xxxx/aaaaとする 2)これまで作成したプログラムを次のように変更してください。 rubyで作成した「シェルスクリプトを実行」の最後を puts ARGF.select{|f| File.basename(f)[/^\d{6}.*lzh$/]}.sort[-1] に変更。 それと「指定されたFinder項目を取得」のパスを先ほどの/Users/xxxx/aaaaに変更する そしてアプリケーションとして保存し、名称を例えば「add_data」とします。 保存場所はどこでもかまいません。 要するに/Users/xxxx/aaaaのなかの最新のファイルを登録するアプリケーションになります。 次に、新しくAutomatorで作成します。ほぼ先ほどのものと同じです。 1) 指定されたFinder項目を取得 もとのサーバのフォルダを指定します。 2) フォルダの内容を取得 3) シェルスクリプトを実行(rubyを指定) で中身は # encoding: utf-8 if RUBY_VERSION < %[1.9.0] require %[jcode] $KCODE=%[utf-8] else Encoding.default_external=%[utf-8] end require %[fileutils] copy_folder=%[/Users/xxxx/aaaa] # データベースに登録されたファイルを入れておくフォルダ finished_file=Dir.glob(copy_folder+%[/*]).collect{|f| File.basename(f)}.sort[-1] # 一番最後に登録したファイル files=ARGF.to_a sorted_files=files.collect{|f| File.basename(f).chomp} .select{|f| f[/^\d{6}(12|16).*lzh$/]}.sort # 対象ファイルを時間順に並び替え i=sorted_files.find_index{|f| f==finished_file} # 最後に登録したファイルの位置 copy_files=finished_file ? sorted_files[i+1..-1] : sorted_files # これから登録するファイル copy_files.each do |f| FileUtils.copy(File.dirname(files[0])+%[/]+f, copy_folder) system %[open -W -a add_data] end です。 そのなかで、 copy_folder=%[/Users/xxxx/aaaa] は、先に作成した登録済みのファイルを入れておくフォルダに書き換えてください。 system %[open -W -a add_data] のadd_dataは先にアプリケーションとして保存したものと合わせておいてください。 こちらのソフトを起動すると、未登録なファイルがあると、/Users/xxxx/aaaaに1つずつコピーして、add_dataが一回ずつ起動します。要するに溜まっていたふぁいるが一気に処理されます。 また、処理するファイルが無い場合には何もせずに終了します。 ちょっとごちゃごちゃしているので、分かりにくくなっていますが、 もしRubyがある程度分かる様になれば、Automatorではなく、Rubyの実行ファイルにした方が分かりやすようにも思います。 両方のファイルともにRubyの実行ファイルにほとんど手間をかけることなく作り替えることができます。
- ki073
- ベストアンサー率77% (491/634)
No.4の補足欄を見逃しておりました。 確認ですが、 一日に該当するファイルが2つできますが、 開始時間~終了時間・・・23:00~00:30 で両方とも処理をしたいのでしょうか? 試験なので、16時のファイル1つだけでよいのでしょうか? それとも、同じファイルを処理すとことがあって、それを回避したいのでしょうか? (こちらかな)
補足
お世話になっております。 お忙しい中、ありがとうございますm(_ _)m 何度もすみません。。。 説明が下手で申し訳ありません。 lzhファイルが保存されるネットワークフォルダには、朝から夕方までの間に約10個のファイルが随時作成されます。 その作成されるファイルは、lzhファイルの他にtxtファイルがあります。 lzhファイルは1日に9時台、10時台、12時台、16時台のだいたい4つ作成され、必要なものは12時台と16時台の2つだけです。 ネットワークフォルダを監視して、12時台のファイルが作成されたら処理を実行、16時台のlzhファイルが作成されたら処理を実行する、という1日に2回の処理を自動ですることが理想です。 現状では、関係のないtxtファイルが作成された場合でも毎回処理に入ってしまうので、目的のファイルが作成された時だけに限定をしたいです。 開始時間と終了時間については私の勘違いでした。 Automatorのフォルダアクションはカレンダーのイベントに登録しなくても、ワークフローとして作成保存した時点で有効になるんですね。 カレンダーに起動時間を設定しないと動かないものだと思っていました。 説明が下手な上に紛らわしいことを書いてすみませんでした。 ちなみに同じファイルを処理することはありません。 取り急ぎお礼まで。。。
- ki073
- ベストアンサー率77% (491/634)
うまくできましたか。良かったです。 テキストデータの処理用にプログラム言語を勉強されるのでしたら、今回使ったRubyをお勧めします。 AppleScriptやシェルスクリプト(baah)よりも癖が無くて分かりやすいはずです。 今回は実質1行で済む簡単なものでしたが、 こちらでは、大量のテキストデータから情報を取り出すことをときどきやっており、Rubyが活躍しております。 AppleScriptがある程度できるようですがRubyはそれよりも簡単です。
お礼
No.5へのお礼が遅くなり大変失礼いたしました。 Rubyの方が癖がないんですね。 先にAppleScriptから見ていたのでびっくりしましたが、ki073様がおすすめしてくれたので、腰を据えて勉強を始めます! 今日、Amaoznで入門書を注文しました。 AutomatorもAppleScriptもとっつきにくかったので、良い機会を与えて下さってありがとうございます。 20年ぐらい修行したら私もki073様のように誰かのお役に立てるでしょうか^^; No.4の補足にも書かせていただきましたが、また壁にぶち当たっています。 明日、入門書が届くのでもう少し試行錯誤してみます。 それでも解決しなかった時はまた相談にのってやって下さい。 どうぞ宜しくお願い致します。 m(_ _)m
- ki073
- ベストアンサー率77% (491/634)
OSX 10.6.8でも試してみましたがこちらでは問題が無いようです。 rubyのバージョンがどちらでも対応できるように書き換えてみましたので試してみてください。 次の行が第1行目になるように(上に空行が入らない) # encoding: utf-8 if RUBY_VERSION < %[1.9.0] require %[jcode] $KCODE=%[utf-8] else Encoding.default_external=%[utf-8] end puts ARGF.select{|f| File.basename(f)[/^\d{6}(12|16).*lzh$/]}.sort[-1] 最後の一行以外は文字コードUTF-8を使うためのおまじないです。書き方が先のものと少し変更されていますが用語統一で本質的には変わりません。 検索条件が少し変更しています。その日のものではなく、数字6桁の次ぎに12または16がくる拡張子lzhのファイルで、最新のものになっています。その日指定であれば today=Time.now.strftime(%[%y%m%d]) puts ARGF.select{|f| File.basename(f)[/^#{today}(12|16).*lzh$/]}.sort[-1] にしてください。
お礼
ki073様 ありがとうございます!!! 10.8のPCでできましたーーーーー!!! すごいすごい!!! 本当にありがとうございます!!! rubyのバージョンが異なるとおまじないの書き方も結構違うものなんですね。 日付の指定をする方法も教えて下さってありがとございます。 平日のみのファイルが欲しいので、感謝感謝です。 % とか ^ 、/ 、 \ など独特な記号が踊り、とっつきにくい印象でしたが、今回の修正が片付いたら参考書を購入してみます。 ki073様に教えていただかなかったら、まず接することはなかったと思いますのでシェルスクリプトに引き続き心から感謝しております。 ありがとうございましたm(_ _)m
補足
ki073様 ありがとうございますm(_ _)m 監視対象のフォルダにファイルが追加された時に自動で動くかどうか試しており、お礼が遅くなってしまいました。 申し訳ありません。 Automatorでは以下のように設定をして動きを試してみました。 1. 指定されたFinder項目を取得 2. フォルダの内容を取得 3. シェルスクリプトを実行 4. Finder項目をコピー 5. 変数の値を設定 6. AppleScriptを実行(圧縮ファイルの解凍、削除、FileMakerへのファイル名受け渡し) カレンダーイベントではお試しで以下のように設定しました。 開始時間~終了時間・・・23:00~00:30 繰り返し・・・(月)~(金) 通知・・・ファイルを開く(上記のファイル) ki073様に教えていただいた、3. のrubyの部分では、目的以外のファイルが追加されても、そのファイルを選択することはなく完璧なのですが、上記のような流れだと、目的以外の場合でも 4. 以降最後まで処理をしてしまいます。 3. のrubyの部分で最新のlzhファイルを選択した時だけ4. 以降の処理を実行したい場合はどのようにしたらよいでしょうか。 全く見当もつきません・・・。 できた!と思ったのに、また質問で本当に申し訳ありません。 心苦しいのですが、もしお時間がございましたらご指導をお願い致します。 m(_ _)m
- ki073
- ベストアンサー率77% (491/634)
No.2の補足欄について、 OSX 10.9のrubyのバージョンが2.0.0で、それ以前のOSXの場合にはrubyが1.8.7なのです。その違いによります。 基本的には最初の二行 # coding: utf-8 Encoding.default_external=%[utf-8] が機能しません。日本語のコードの問題もありますので、明日OSX 10.6で確認してみます。 今のところ、 # coding: utf-8 Encoding.default_external=%[utf-8] の二行を require %[jcode] $KCODE=%[UTF8] に変更することで大丈夫だと思っています。 日本語のファイル名が混じっている場合には問題になるかも知れませんので確認してみます。 それと、 %[UTF8] のように特殊な書き方をしています。 "UTF8"と全く同じ意味なのですが、Automatorに入力するときにはちょっと問題が発生することがありますので、あえ文字列を %[]で囲って書いています。スマート引用符がオンになっていて、オフにしないと""や''正常に入力できないのです。入力する領域で右クリックでスマート引用符をオフにできるのですが、分かりにくいのであえてそのような書き方をしています。 他のサイトを参考にするときには読み替えてください。
お礼
深夜にも関わらず早速のご回答ありがとうございますm(_ _)m 後出しになってしまい申し訳ありません。 ファイル名は半角英数のみで、日本語は使用されていません。 お気遣いありがとうございました。 教えていただいたように、 require %[jcode] $KCODE=%[UTF8] と変更したらエラーは出なくなりました! ありがとうございます! 結果は、 ファイル名が今日の日付でlzhの最新ファイルは得られたのですが、 ファイル名が今日の日付とは関係のない文字列で、拡張子がcsvのファイルも選択されていました。 2つ目のcsvの方はフォルダ内で最新のファイルです。 拡張子の指定が利いていないようなのですが、ここもrubyのバージョンが影響しているのでしょうか? お作法がいろいろあって難しいです。。。 これだけご教示いただいているのに、なかなか「解決」とできずに申し訳ありません。 またお暇ができた時にでも構いませんので、ご指導よろしくお願いいたします。 m(_ _)m
- 1
- 2
お礼
ki073様 お世話になっております。 ついにできました~~~~~~!!! めちゃくちゃ嬉しいです。 これでファイルができるまでフォルダとにらめっこしなくて済みます。 本当にありがとうございました!!! ki073様のお力がなければ、自分だけでは絶対にたどり着けなかったので、心から感謝しております。 感謝の気持ちが届いているか心配ですが、本当に本当にありがとうございました。 m(_ _)m 職場のPCでばっちり動いたので、午後から早速実際のデータで試運転をしてみようと思います。 なぜか私のMacBook Airでは全く反応しなくなってしまったのですが、私のPCがおかしいのかも知れません。 あと、OS X10.8の方では、add_data2を指定しているところで、「.app」を足さないとだめでした。 無反応になる前のOS X10.9の方では特に必要なかったと思います。 それと、最後にご教示いただいたスクリプトではフォルダへのコピーはしてい様子だったので、add_data2の方で引数を受け取った後に、「Finder項目のコピー」を入れました。 わかりやすい解説付きでしたので、処理の流れがぼんやりとでも理解できて感謝しております。 今回の難題が無事に終わりましたので、Rubyのお勉強に入ろうと思います。 また壁にぶち当たった時はこちらで相談させていただきますので、今後ともご指導宜しくお願い致します。 お世話になりまして、本当にありがとうございました。 m(_ _)m