こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

AutomatorのFinder項目のフィルタ適用

お世話になります。
以前、こちらで「Automatorで変数を使ったファイル検索」というタイトルで相談させていただいて、お陰様で希望通りの結果を得ることができました。
http://okwave.jp/qa/q8563519.html

前回相談させていただいた時は、Automatorを使って特定の時間に、流動的なファイル名のフォルダを別のフォルダにコピーをしたい、という内容が目的でした。

今回はこれまでと状況が変わり、特定の時間では対応できなくなってしまったので、Automatorで特定のフォルダを監視しつつ、特定の条件を満たすファイル(流動的なファル名)が作成された時点でコピーの処理を実行したいのですが、「Finder項目にフィルタを適用」の部分でつまづいています。

検索したいファイル名は、12時台に作成される 「yymmdd12○○○.csv」と、
16時台に作成される「yymmdd16○○○.csv」というファイル名です。

監視するフォルダにはこのcsvファイル以外にも毎日複数のファイルが作成されています。

Automatorでは以下のように試してみました。

1. 指定されたFinder項目を取得
2. フォルダの内容を取得
3. 変数の値を設定
    変数名:今日の日付
    カスタムフォーマット:yymmdd
4. Finder項目にフィルタを適用

4. のフィルタの部分で、ファイル名に「12時台」を示す文字列を付与した「yymmdd15」というキーワードで検索をしたいのですが、フィルタの設定ではどのようにしたらよいのかわかりません。

そもそもフィルタの適用の設定で、変数を使うことはできないのですか?

12時台と16時台の2つの条件を設定するのは難易度が高そうなので、16時台の方は今までのやり方でAutomatorで指定の時間に処理を実行する方法でも構いません。

Finder項目にフィルタを適用する際に、変数を使用する方法を教えて下さい。
もしそれが不可能でしたら、他にどのような方法がありますか?

ご指導よろしくお願いします。

投稿日時 - 2014-05-24 11:47:25

QNo.8608714

すぐに回答ほしいです

質問者が選んだベストアンサー

もっとシンプルにフォルダアクションを

# 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のドラッグすれば良いので、使うにはこれで十分かも。

投稿日時 - 2014-05-29 21:33:04

お礼

ki073様
お世話になっております。

ついにできました~~~~~~!!!
めちゃくちゃ嬉しいです。
これでファイルができるまでフォルダとにらめっこしなくて済みます。
本当にありがとうございました!!!

ki073様のお力がなければ、自分だけでは絶対にたどり着けなかったので、心から感謝しております。
感謝の気持ちが届いているか心配ですが、本当に本当にありがとうございました。
m(_ _)m

職場のPCでばっちり動いたので、午後から早速実際のデータで試運転をしてみようと思います。

なぜか私のMacBook Airでは全く反応しなくなってしまったのですが、私のPCがおかしいのかも知れません。

あと、OS X10.8の方では、add_data2を指定しているところで、「.app」を足さないとだめでした。
無反応になる前のOS X10.9の方では特に必要なかったと思います。

それと、最後にご教示いただいたスクリプトではフォルダへのコピーはしてい様子だったので、add_data2の方で引数を受け取った後に、「Finder項目のコピー」を入れました。

わかりやすい解説付きでしたので、処理の流れがぼんやりとでも理解できて感謝しております。

今回の難題が無事に終わりましたので、Rubyのお勉強に入ろうと思います。
また壁にぶち当たった時はこちらで相談させていただきますので、今後ともご指導宜しくお願い致します。

お世話になりまして、本当にありがとうございました。
m(_ _)m

投稿日時 - 2014-05-30 13:25:23

ANo.12

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(13)

ANo.13

>エラーの内容は「Stufflt Expanderが予期しない理由で終了しました

Stufflt Expanderが不調でしたら、別の方法が有ります。
まずこちらを参考に。AppleScriptにも対応しています。
http://macrunner.blog.fc2.com/blog-entry-54.html

ほかにもコマンドからやる方法もありますが、こちらはいろいろインストールしないといけないので、まず上の方法を試してみたください。

投稿日時 - 2014-05-29 23:19:50

お礼

お世話になっております。

ご紹介いただいたアプリは私も最初にインストールして試したのですが、AppleScriptから解凍して、その後にlzhのオリジナルフォルダを削除する機能が使えなかったので、Stufflt Expanderに変更した次第です。

職場のPCではStufflt Expanderでのエラーは一度も起きていないので、やはり私のPCが怪しい気がします。。。

以前も、別のアプリが正常な動きをせずにOSの再インストールをしたらアッサリ解決したことがあります。
まだ購入から数ヶ月なんですけども^^;

代替案までご紹介いただきまして、ありがとうございましたm(_ _)m

投稿日時 - 2014-05-30 13:29:41

ANo.11

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は登録するファイル名を渡して実行します。

投稿日時 - 2014-05-29 17:55:12

補足

お世話になっております。
詳しい解説まで付けていただきまして、本当にありがとうございます。
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

投稿日時 - 2014-05-29 21:46:16

ANo.10

No.6の補足欄について
まだ理解できていないところがあるのですが、

>Automatorのフォルダアクションはカレンダーのイベントに登録しなくても、ワークフローとして作成保存した時点で有効になるんですね。

フォルダアクションは使った事がないのですが、ネットワーク上のフォルダでも動くのでしょうか?(半分独り言です)

>現状では、関係のないtxtファイルが作成された場合でも毎回処理に入ってしまうので、目的のファイルが作成された時だけに限定をしたいです。

txtファイルが作成されたきには前のファイルをもう一度二重に処理されませんか?
なにか二重に処理されないようにそちらでプログラムを追加しているのでしょうか?

いずれにしても、No.7の方法だと関係のないtxtファイルが作成された場合には直ぐに終了しますので、影響はないと思います。
書き換え中ですのでNo.7を使うのはしばらくお待ちください。動くことは動くとは思いますが。

投稿日時 - 2014-05-29 12:27:53

お礼

ki073様

お世話になっております。
お忙しい中、何度もご回答いただきまして本当にありがとうございます。


> フォルダアクションは使った事がないのですが、ネットワーク上のフォルダでも動くのでしょうか?(半分独り言です)

はい、動いております。


> txtファイルが作成されたきには前のファイルをもう一度二重に処理されませんか?
なにか二重に処理されないようにそちらでプログラムを追加しているのでしょうか?

はい、最後のlzhフォルダで二重に処理されています。
二重に処理をされないプログラムは、まっっったく方法がわからないので、追加はしていません。


教えていただいたNo.7の方法を昨夜と今日で何度か挑戦しているのですが、こちらではエラーとなってしまいまだ結果を見ることができていません。

ネットでエラーの内容などを調べてはいるのですが、どうにもわからなくてお手上げになりましたら、またエラーの内容を相談させて下さい。


> いずれにしても、No.7の方法だと関係のないtxtファイルが作成された場合には直ぐに終了しますので、影響はないと思います。

ありがとうございます!
その動作はまさに理想です!

貴重なお時間を割いてプログラムを作っていただきまして、本当に感謝しております。
ありがとうございますm(_ _)m

投稿日時 - 2014-05-29 13:59:53

ANo.9

No.7のプログラムは急ごしらえなので、メンテナンスもできないようなぐちゃぐちゃになっています。

すっきりして、分かりやすいプログラムに書き換えがほぼできました、夜にでも書き込みますのでお待ちください。

投稿日時 - 2014-05-29 11:07:55

ANo.8

書き忘れました
/Users/xxxx/aaaa
が空っぽだったら、対象となる全部のファイルを登録しようとしますので、少し前のファイルを最低一個入れておいてください。
その次の時間のファイルから順番に登録していきます。

投稿日時 - 2014-05-28 23:49:08

ANo.7

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の実行ファイルにほとんど手間をかけることなく作り替えることができます。

投稿日時 - 2014-05-28 23:45:16

ANo.6

No.4の補足欄を見逃しておりました。

確認ですが、
一日に該当するファイルが2つできますが、
開始時間~終了時間・・・23:00~00:30
で両方とも処理をしたいのでしょうか?
試験なので、16時のファイル1つだけでよいのでしょうか?

それとも、同じファイルを処理すとことがあって、それを回避したいのでしょうか?
(こちらかな)

投稿日時 - 2014-05-28 18:04:18

補足

お世話になっております。
お忙しい中、ありがとうございますm(_ _)m
何度もすみません。。。

説明が下手で申し訳ありません。
lzhファイルが保存されるネットワークフォルダには、朝から夕方までの間に約10個のファイルが随時作成されます。
その作成されるファイルは、lzhファイルの他にtxtファイルがあります。

lzhファイルは1日に9時台、10時台、12時台、16時台のだいたい4つ作成され、必要なものは12時台と16時台の2つだけです。

ネットワークフォルダを監視して、12時台のファイルが作成されたら処理を実行、16時台のlzhファイルが作成されたら処理を実行する、という1日に2回の処理を自動ですることが理想です。

現状では、関係のないtxtファイルが作成された場合でも毎回処理に入ってしまうので、目的のファイルが作成された時だけに限定をしたいです。

開始時間と終了時間については私の勘違いでした。
Automatorのフォルダアクションはカレンダーのイベントに登録しなくても、ワークフローとして作成保存した時点で有効になるんですね。
カレンダーに起動時間を設定しないと動かないものだと思っていました。
説明が下手な上に紛らわしいことを書いてすみませんでした。

ちなみに同じファイルを処理することはありません。

取り急ぎお礼まで。。。

投稿日時 - 2014-05-29 01:54:50

ANo.5

うまくできましたか。良かったです。

テキストデータの処理用にプログラム言語を勉強されるのでしたら、今回使ったRubyをお勧めします。
AppleScriptやシェルスクリプト(baah)よりも癖が無くて分かりやすいはずです。

今回は実質1行で済む簡単なものでしたが、
こちらでは、大量のテキストデータから情報を取り出すことをときどきやっており、Rubyが活躍しております。
AppleScriptがある程度できるようですがRubyはそれよりも簡単です。

投稿日時 - 2014-05-26 18:16:24

お礼

No.5へのお礼が遅くなり大変失礼いたしました。

Rubyの方が癖がないんですね。
先にAppleScriptから見ていたのでびっくりしましたが、ki073様がおすすめしてくれたので、腰を据えて勉強を始めます!
今日、Amaoznで入門書を注文しました。

AutomatorもAppleScriptもとっつきにくかったので、良い機会を与えて下さってありがとうございます。
20年ぐらい修行したら私もki073様のように誰かのお役に立てるでしょうか^^;

No.4の補足にも書かせていただきましたが、また壁にぶち当たっています。

明日、入門書が届くのでもう少し試行錯誤してみます。
それでも解決しなかった時はまた相談にのってやって下さい。

どうぞ宜しくお願い致します。
m(_ _)m

投稿日時 - 2014-05-28 10:45:43

ANo.4

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]
にしてください。

投稿日時 - 2014-05-26 12:37:22

補足

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

投稿日時 - 2014-05-27 00:40:26

お礼

ki073様

ありがとうございます!!!
10.8のPCでできましたーーーーー!!!
すごいすごい!!!
本当にありがとうございます!!!

rubyのバージョンが異なるとおまじないの書き方も結構違うものなんですね。

日付の指定をする方法も教えて下さってありがとございます。
平日のみのファイルが欲しいので、感謝感謝です。

% とか ^ 、/ 、 \ など独特な記号が踊り、とっつきにくい印象でしたが、今回の修正が片付いたら参考書を購入してみます。
ki073様に教えていただかなかったら、まず接することはなかったと思いますのでシェルスクリプトに引き続き心から感謝しております。
ありがとうございましたm(_ _)m

投稿日時 - 2014-05-26 15:37:05

ANo.3

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に入力するときにはちょっと問題が発生することがありますので、あえ文字列を %[]で囲って書いています。スマート引用符がオンになっていて、オフにしないと""や''正常に入力できないのです。入力する領域で右クリックでスマート引用符をオフにできるのですが、分かりにくいのであえてそのような書き方をしています。
他のサイトを参考にするときには読み替えてください。

投稿日時 - 2014-05-26 00:55:28

お礼

深夜にも関わらず早速のご回答ありがとうございますm(_ _)m

後出しになってしまい申し訳ありません。
ファイル名は半角英数のみで、日本語は使用されていません。
お気遣いありがとうございました。

教えていただいたように、
   require %[jcode]
   $KCODE=%[UTF8]
と変更したらエラーは出なくなりました!
ありがとうございます!

結果は、
ファイル名が今日の日付でlzhの最新ファイルは得られたのですが、
ファイル名が今日の日付とは関係のない文字列で、拡張子がcsvのファイルも選択されていました。

2つ目のcsvの方はフォルダ内で最新のファイルです。

拡張子の指定が利いていないようなのですが、ここもrubyのバージョンが影響しているのでしょうか?
お作法がいろいろあって難しいです。。。

これだけご教示いただいているのに、なかなか「解決」とできずに申し訳ありません。
またお暇ができた時にでも構いませんので、ご指導よろしくお願いいたします。
m(_ _)m

投稿日時 - 2014-05-26 01:49:22

ANo.2

ちょっと間違いがありました。
あのままだと、その日に最後に作ったファイルがフィルタリングされてしまいます。
ワイルドカードと正規表現の書き方で差があることを勘違いしていました。
単純に、*の前にピリオドが無かったことが原因なのですが、
拡張子がlzhだっと思いますのでそれだけに、後は微妙に改良しています。

puts ARGF.select{|f| File.basename(f)[/^#{today}(12|16).*lzh$/]}.sort[-1]


いらぬお世話かもしれませんが、
集計対象となるファイルがさらに増えてきた入りすると、間違いの原因になってくと思います。
1) ファイルを作成する側が、集計対象のファイルが分かっているはずですので、それだけを別のフォルダにコピーしてもらい、そのフォルダに入っているものを集計対象とする。集計が終わるとそのフォルダから消してしまう。
これだとファイルの有無だけを判断すれば良い。

2) 別の方法として、ファイルを決まった題名をつけてメールで送ってもらう。
OSXのmailソフトの機能として、特定の条件のメールでAppleScripで処理する機能があります。
こちらの方がいちいちフォルダをチェックしなくても良いので監視が楽になります。
送る側も自動化するのはそんなに難しくありません。

投稿日時 - 2014-05-24 21:51:36

補足

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

投稿日時 - 2014-05-25 23:41:45

お礼

ki073様

お礼が遅くなってすみません。
ご丁寧なご指導をありがとうございますm(_ _)m
昨日から急な出張が入り、今夜帰宅するまで教えていただいた方法を試してみることができません。
すぐに試したくてウズウズしているのですが、帰宅しましたらやってみて、また改めてお礼にうかがいます。
取り急ぎお礼まで。
ありがとうございました。

投稿日時 - 2014-05-25 13:14:35

ANo.1

質問欄で
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以外はそのままでは動かないように思いますので、もし違うのでしたら書き込んでください。

投稿日時 - 2014-05-24 19:02:35

お礼

お世話になります。

No.2のご回答でご提案いただきました件についてですが、現在、検索対象のフォルダにはファイルが3,000個ほど保存されています。
毎日だいたい10~20個ずつ増えていくので、ご指摘いただいた点は私も頭の痛いところなのですが、お客様側で作成されたAccessによるシステムがインストールされており、そのAccessでの処理後にlzhフォルダが作成されています。

こちらからお客様に (1) と (2) のお願いすることは難しい関係でして・・・。
(Accessのシステムを作った従業員の方は退職されてしまったのでいじれない、というお話しをチラッと聞いたことがあります。)

当社のPCにインストールされているので、先方の了解が得られればこちらで修正させていただくことは可能かも知れません。
上司がそれを問い合わせてくれるかどうか、そちらの方がハードルが高い状況にありますが^^;

zhファイルだけコピーして、保存先を専用の別フォルダに変更するだけならAccessのスクリプトを変更するだけなので、メールの件名よりはお願いしやすいと思いますので、一度上司に相談してみます。
コピー先のフォルダなら、読み込み後に削除しても問題ないので、ファイルの有無だけを判断したらよいというのが素晴らしいですよね。
勉強になります。

素晴らしいご提案もありがとうございました!

投稿日時 - 2014-05-26 00:20:15

あなたにオススメの質問