- ベストアンサー
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)
ちょっと間違いがありました。 あのままだと、その日に最後に作ったファイルがフィルタリングされてしまいます。 ワイルドカードと正規表現の書き方で差があることを勘違いしていました。 単純に、*の前にピリオドが無かったことが原因なのですが、 拡張子がlzhだっと思いますのでそれだけに、後は微妙に改良しています。 puts ARGF.select{|f| File.basename(f)[/^#{today}(12|16).*lzh$/]}.sort[-1] いらぬお世話かもしれませんが、 集計対象となるファイルがさらに増えてきた入りすると、間違いの原因になってくと思います。 1) ファイルを作成する側が、集計対象のファイルが分かっているはずですので、それだけを別のフォルダにコピーしてもらい、そのフォルダに入っているものを集計対象とする。集計が終わるとそのフォルダから消してしまう。 これだとファイルの有無だけを判断すれば良い。 2) 別の方法として、ファイルを決まった題名をつけてメールで送ってもらう。 OSXのmailソフトの機能として、特定の条件のメールでAppleScripで処理する機能があります。 こちらの方がいちいちフォルダをチェックしなくても良いので監視が楽になります。 送る側も自動化するのはそんなに難しくありません。
お礼
ki073様 お礼が遅くなってすみません。 ご丁寧なご指導をありがとうございますm(_ _)m 昨日から急な出張が入り、今夜帰宅するまで教えていただいた方法を試してみることができません。 すぐに試したくてウズウズしているのですが、帰宅しましたらやってみて、また改めてお礼にうかがいます。 取り急ぎお礼まで。 ありがとうございました。
補足
ki073様 お世話になっております。 前回に引き続きご指導いただきまして、本当にありがとうございます。 「Finder項目にフィルタを適用」では無理なんですね。 まだ教えていただいたrubyのスクリプトを1つ1つ検索して学習できていなくて、ぼんやりとした流れしか理解できていないのですが、そのまま以下のようにコピペさせていただきました。 -------------------------------------------------- # coding: utf-8 Encoding.default_external=%[utf-8] today=Time.now.strftime(%[%y%m%d]) puts ARGF.select{|f| File.basename(f)[/^#{today}(12|16).*lzh$/]}.sort[-1] --------------------------------------------------- 結果は、 ・私物のMacBook Air OS X10.9 では、バッチリでした!!! ファイル名をいろいろな日付、時間に変更して試してみましたが、その日の最新の方のファイルが選択され、希望通りの結果を得られました。 ・職場のMac mini OS X10.8 では、「-e:3: uninitialized constant Encoding (NameError)」というエラーが表示されました。 翻訳したら「初期化されていない一定のエンコーディング」と出ました。 うーーん・・・わかりません。 職場のPCで動くようにしたいのですが、どのように変更したらよいでしょうか。 ネットで検索してみましたが、ヒントになりそうなことすらわかりませんでした。 甘えてばかりで恐縮ですが、またお時間がございましたら、引き続きご指導いただけますようお願いいたします。 m(_ _)m
- ki073
- ベストアンサー率77% (491/634)
質問欄で 1. 指定されたFinder項目を取得 2. フォルダの内容を取得 3. 変数の値を設定 4. Finder項目にフィルタを適用 の場合は4が2と3のデータ2つを受け取らないとフィルタリングできないので無理です。 3と4を一つにして2からだけしかデータを受け取らないようにする必要がありますので、標準のアクションでは無理です。 やり方ですが、前回のやり方を踏襲すると ls /Volumes/○○○/●●●/`date +%y%m%d`{12,16}*.csv なのですが、16時のファイルができていると12時のファイルも一緒に検出されるので、多分スクリプトが正常には動かないと思います。 (2つのファイルが同時に存在すると問題がありそうな) 16時のファイルが存在すると、12時を無視して16時だけ、 12時だけだとそれだけを検出するようなスクリプトを書いてみました。 1. 指定されたFinder項目を取得 2. フォルダの内容を取得 3 以下のスクリプト 同じく、シェルスクリプトを実行ですが、ちょっと複雑そうなのでbashではなくrubyで書いてみました。 シェルを/usr/bin/rubyに変更してください。入力の引き渡し方法はstdinへで変更ありません。 次の行から。一行目の上には、空白行を入れないように # coding: utf-8 Encoding.default_external=%[utf-8] today=Time.now.strftime(%[%y%m%d]) puts ARGF.to_a.select{|f| File.basename(f)[/#{today}(12|16)*.csv/]}.sort[-1] 上の行の(12|16)で12または16であるファイル名をフィルタリングしています。また、sortで並び替え、[-1]で最後の要素1つを出力しています。 ただし、OSX10.9以外はそのままでは動かないように思いますので、もし違うのでしたら書き込んでください。
お礼
お世話になります。 No.2のご回答でご提案いただきました件についてですが、現在、検索対象のフォルダにはファイルが3,000個ほど保存されています。 毎日だいたい10~20個ずつ増えていくので、ご指摘いただいた点は私も頭の痛いところなのですが、お客様側で作成されたAccessによるシステムがインストールされており、そのAccessでの処理後にlzhフォルダが作成されています。 こちらからお客様に (1) と (2) のお願いすることは難しい関係でして・・・。 (Accessのシステムを作った従業員の方は退職されてしまったのでいじれない、というお話しをチラッと聞いたことがあります。) 当社のPCにインストールされているので、先方の了解が得られればこちらで修正させていただくことは可能かも知れません。 上司がそれを問い合わせてくれるかどうか、そちらの方がハードルが高い状況にありますが^^; zhファイルだけコピーして、保存先を専用の別フォルダに変更するだけならAccessのスクリプトを変更するだけなので、メールの件名よりはお願いしやすいと思いますので、一度上司に相談してみます。 コピー先のフォルダなら、読み込み後に削除しても問題ないので、ファイルの有無だけを判断したらよいというのが素晴らしいですよね。 勉強になります。 素晴らしいご提案もありがとうございました!
- 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