Terminalから複数の画像(png)を「Quick Look」で開くには?

あるフォルダに「fig1.png, fig2.ping, …」が有るとして、現在は「open -F fig*.png」を実行すると、一つのpreview.appで開かれて、矢印キーで画像を閲覧できる様になて居ます。


本当は「Quick Look」で開くのが望ましいです。どの様にすれば善いか、お教え下さいませんか?

Mac mini, Mac OS X (10.7.5), Mac mini(mid 2011), iMac(late 2009)

投稿日 2013/04/08 03:26

返信
返信: 186

2013/05/23 19:05 mNeji への返信

すばらしいです!私の環境でもちゃんと動きました。以下はこのままでも良いけど、こうしたらもっと良くなるという案です。


設置場所: 設置場所は ~/Sites 以外の場所にした方が良いです。ここは「Web 共有」のためにあるディレクトリなので目的が違います。~/Document か ~/Music あたりでどうでしょう。今後のメンテナンスを考えて「radio_list.txt」と同じ場所にするのがおすすめです。


ファイル名とその変数: ファイル名とその変数はダブルクォーテーションで括りましょう。この場合は大丈夫ですが、ケースバイケースではなく無条件で括った方が良いです。そうしないと、必要なときに括り忘れて誤動作...なんてことになりかねません。そういう事故をたくさん見てきました。


$lineNum: 折角オプション解析までつけたのですから、$lineNum が数値ではない場合への対策も欲しいところ。-lx などと不正なパラメータを与えた場合、tail コマンドでエラーになります。


sed: sed コマンドの部分は AppleScript 側の date コマンドでやりましょう。二重処理になってます。


grep: grep コマンドは直接ファイルを指定できます。なので cat コマンドもパイプも不要。また、-i オプションを付けても良いかもしれません。(これは好みかな)


tail: tail コマンドも grep コマンドと同様に直接ファイルを指定できます。


ファイルの存在確認: 一番最初に使うときのために、radio_list.mid.tsv などのファイルが存在しない場合の対策もあった方が良いです。


あと、typo の指摘で申し訳ありませんが、「sortWords」と「brouser」。


以上です。しかし、よくぞここまでたどり着きましたね。オプション解析付きのシェルスクリプトが出てくるとは思いませんでした。

2013/05/24 01:13 Hiro__S への返信

Hiro.Sさん、


詳しい解説有り難うございます。丁寧に拝見して対処をしたいと思います。


その後、以前教えていただいたAppleScriptを改造して、昨日ご報告したradioListViewを組み込みました。「AppleScript Editor」でデバッグして正しく動作するのを確認してから、.appとして保存しました。


それを走らせると、新たな項が~/Music/radio_list.txtに追記されるものの、radioListViewによるhtmlが立ち上がりませんし、エラーもでません。


ご参考の為に、スクリプトを掲載します;



on run



-- property

set dname to (path to music folder) as text -- $HOME/Music

set fname to "radio_list.txt"

set full_path to dname & fname-- $HOME/Music/fname

set my_view to "/Users/u1/bin/radioListView"



-- dialog text

set ttl1 to "Radio Info List Maker"

set msg1 to "リストファイルに追加しますか?"

set msg2 to "リストファイルを開きますか?"


--


try



-- iTunes

tell application "iTunes"

set track_name to name of current track

set stream_title to current stream title

if stream_title is missing value then return

end tell



-- me

tell me



(* msg1:"リストファイルに追加しますか?"に関する処理

using terms from application "Finder"

display dialog msg1 default answer stream_title with title ttl1

set res to text returned of result

end using terms from

*)




-- go!

do shell script ("\n ymd=$(date '+%Y-%m-%d-%H%M%S')\n trc=" & quoted form of track_name & "\n res=" & quoted form of stream_title & "\n lst=" & quoted form of fname & "\n cd " & quoted form of (POSIX path of dname) & " &&\n echo \"${ymd}\t${trc}\t${res}\" >>\"${lst}\"\n\t\t\t")



-- msg2: "リストファイルを開きますか?"に関する処理


(* 無条件で開くにするには、「質問をしないで進む
めば良い」ので、下記をコメントアウト。

using terms from application "Finder"

display dialog msg2 with title ttl1

end using terms from

*)



(* open file with TextWrangler

tell application "TextWrangler"

activate

open full_path as alias

end tell

*)



-- show recent seven musics

do shell script ("$(radioListView -l 7)")


end tell


on error err_msg

return err_msg

end try


end run




スクリプトのフルパスを定義がまだ理解できてないので、これから泥縄で調べます。


また、当方では「-- go!」のコマンドが巧く整形できませんが、対策はないものでしょうか。


宜しくお願い申し上げます。

2013/05/24 03:30 mNeji への返信

do shell script ("$(radioListView -l 7)")


これでは radioListView にパスが通ってないので動きません。書き方も間違っています。コマンド (この場合はシェルスクリプト) へのパスはフルパスで書く必要があります。


また、当方では「-- go!」のコマンドが巧く整形できませんが、対策はないものでしょうか。


\t は \\t とバックスラッシュをエスケープします。\n はこの場合は不要かと。もし必要な場合は \t と同様に \\n とします。また、echo コマンドでダメな場合は printf コマンドで書くとより確実です。


で、こんな感じでどうでしょうか。

        tell me                         do shell script ("                 ymd=$(date '+%Y-%m-%d-%H%M%S')                 trc=" & quoted form of track_name & "                 res=" & quoted form of stream_title & "                 lst=" & quoted form of fname & "                 cd " & quoted form of (POSIX path of dname) & " &&                 echo \"${ymd}\\t${trc}\\t${res}\" >>\"${lst}\"             ")                         do shell script ("                 $HOME/bin/radioListView -l7             ")                     end tell


# 上のコードは Firefox でコピーしても空改行が入りません。なるほど、こう書けば良いのか...。

2013/05/24 06:22 Hiro__S への返信

Hiro.S さん、早速のご返答ありがとうございます。


結論から先に申し上げれば、動きました。


残念なことにエディタ上では、已然として乱れます。ブラウザはSafariとしていますが;


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


とはいえ、「スクリプトは常に二重引用符によって左右が囲まれ」、途中に入る「AppleScriptの部分は二重引用符によって左右が囲まれ無い」で、夫々の要素は「&」と事は理解できました。文法書無視の為で、ご迷惑をおかけします。ご免なさい。



\t は \\t とバックスラッシュをエスケープします。\n はこの場合は不要かと。もし必要な場合は \t と同様に \\n とします。また、echo コマンドでダメな場合は printf コマンドで書くとより確実です。


未だ、違和感が強いのですが、慣れでしょうね。 printfは不得意なのですが、この際練習します。


これでは radioListView にパスが通ってないので動きません。書き方も間違っています。コマンド (この場合はシェルスクリプト) へのパスはフルパスで書く必要があります。


当面はこの方式に統一します。




# 上のコードは Firefox でコピーしても空改行が入りません。なるほど、こう書けば良いのか...。


SafariとFirefoxで同じ様にコピーできると助かります。



これで、一貫したストリーミング音楽のリスト&ビューができました。検索は思いのほかに分析ができるので驚いています。


余裕ができたら、jQueryの解説書を読んで、検索窓をhtml画面に出したいものです。あ、グラフ化も良いなぁ。


ユックリと宿題に励みます。

2013/05/24 07:45 mNeji への返信

結論から先に申し上げれば、動きました。


良かったですね。私までうれしくなっちゃいました。


残念なことにエディタ上では、已然として乱れます。


ああ、やっと分かりました。AppleScript Editor の環境設定で、「文字列中のタブや改行をエスケープ」を OFF にしてください。


printfは不得意なのですが、この際練習します。


echo コマンドの場合、-n オプションと -e オプションの実装状況がカオスになってたり、その他の挙動にもばらつきがあったりします。printf コマンドはその点安心して使えるので、絶対覚えておいた方が良いです。


あとは微調整でしょうから、ゆっくりと仕上げてください。自分で書いたスクリプトは格別でしょ。動いた〜という感動があるからやめられないんですよね。本当におつかれさまでした。

2013/05/24 09:25 Hiro__S への返信

Hiro.S さん:


良かったですね。私までうれしくなっちゃいました。


FAQの質問にも関わらず、懇切丁寧にご指導くださった賜物です。ありがとうございます。その上「Quick Look」どころか、動的な「Quick Look」と呼べる様なシステムの萌芽に触れられて、楽しかったです。


日常の大半のデータ分析が、エディタとブラウザを基本部品に構築できるというのは痛快です。いっその事、Hiro.Sさんのような専門家が一連のアプリケーション群を作り出させると面白いのではと思います。例えば、絞り込んだデータからCDの検索・手配するとか、善い局があればiTuhes内で登録するとか。物忘れの激しくなった者のサポートにピッタリです。最近のexcelのデザインにヘキヘキしている私のようなユーザも結構居ると思いますし。



ああ、やっと分かりました。AppleScript Editor の環境設定で、「文字列中のタブや改行をエスケープ」を OFF にしてください。

お恥ずかしい事に自分の設定が……。直した所、非常に明瞭に理解できました;


・「do shell script ("」と「")」の二重引用符に囲まれている!


にに気が回りませんでした!



echo コマンドの場合、-n オプションと -e オプションの実装状況がカオスになってたり、その他の挙動にもばらつきがあったりします。printf コマンドはその点安心して使えるので、絶対覚えておいた方が良いです。


肝に銘じて実行致します。




あとは微調整でしょうから、ゆっくりと仕上げてください。自分で書いたスクリプトは格別でしょ。動いた〜という感動があるからやめられないんですよね。本当におつかれさまでした。


はい、そのように致します。具体的には、SafariとFirefoxの二本立てだったので、データ表示向けに「軽量で機敏なブラウザの選定」が今後の重要な課題になりそうです。確かに、自作の工具を作りながら、それを工作にフィード・バックしているような気分ですね。


久しぶりにリラックスできそうです。こちらこそ、お疲れさまでした。

2013/05/26 04:22 mNeji への返信

Hiro.Sさん、


「2013/05/24 11:05」に下さったコメントに対する応答です。それにうまく返信ができなかったので、最新の記事にリンクさせていただきます。



すばらしいです!私の環境でもちゃんと動きました。以下はこのままでも良いけど、こうしたらもっと良くなるという案です。


お師匠さんに動作確認戴いて光栄です。以下に、自分の感触をお示しさせて戴きます。



設置場所: 設置場所は ~/Sites 以外の場所にした方が良いです。ここは「Web 共有」のためにあるディレクトリなので目的が違います。~/Document か ~/Music あたりでどうでしょう。今後のメンテナンスを考えて「radio_list.txt」と同じ場所にするのがおすすめです。


長い事、.htmlファイルはブラウザから「localhost/~自分のアカウント名」で開くものだと思い込んでいました。また、javascript,jqueryなども「~/Sites」の何処かに1つだけ置くべきと思っていました。最近、図書館で参考書を借りて泥縄勉強中ですが、サンプル・ファイルごとにjquery.jsが付いていて驚いています。


そこで、ご指摘に沿って、「~/Music」にディレクトリ「~/Music/RadioList」を生成させて、「radio_list.txt」と同じ階層に置く様にして見ます。



ファイル名とその変数: ファイル名とその変数はダブルクォーテーションで括りましょう。この場合は大丈夫ですが、ケースバイケースではなく無条件で括った方が良いです。そうしないと、必要なときに括り忘れて誤動作...なんてことになりかねません。そういう事故をたくさん見てきました。


はい、そうします。自分はファイル名に「半角の空白」は使わないので、括っていませんでした。以後、気をつけます。



$lineNum: 折角オプション解析までつけたのですから、$lineNum が数値ではない場合への対策も欲しいところ。-lx などと不正なパラメータを与えた場合、tail コマンドでエラーになります。


あはは、getoptsを使ったのは生まれて初めてです。少し触って感じを掴みたいと思います。



sed: sed コマンドの部分は AppleScript 側の date コマンドでやりましょう。二重処理になってます。


確かに奇妙に見えるのでしょうね。調べて見ます。



grep: grep コマンドは直接ファイルを指定できます。なので cat コマンドもパイプも不要。また、-i オプションを付けても良いかもしれません。(これは好みかな)


tail: tail コマンドも grep コマンドと同様に直接ファイルを指定できます。

此ればかりは、当方がド素人の為に「パイプは須く左から右へと流れる様に書く」という方針の為です(笑)。


# 本音は、記憶力が笊の為です(泣)。



ファイルの存在確認: 一番最初に使うときのために、radio_list.mid.tsv などのファイルが存在しない場合の対策もあった方が良いです。


はい、対応いたします。



あと、typo の指摘で申し訳ありませんが、「sortWords」と「brouser」。


はい、「searchWords」と「browser」に改めます。



以上です。しかし、よくぞここまでたどり着きましたね。オプション解析付きのシェルスクリプトが出てくるとは思いませんでした。


せっかく書いたのですが、.appにするとオプションの入力が出来ないので愕然としました。結局、htmlに;


•「-l相当の行数の入力窓」を、

•「-sの検索語の入力窓」を用意して、

•これらがダブル・クリックしたら再表示する。

•終了ボタンも欲しいかも。


といった仕組みが必要性ではないかと思い至りました。


ここら辺を実行するには、現状のjavascript, jqueryについての知識が無さ過ぎなので、最新のfavascriptの本、なんと発行日が2013-05-30、を購入してきたので、本格的な泥縄勉強を初めます。

2013/05/26 08:11 mNeji への返信

私も mNeji さんと同じ単なるユーザです。たまたま知っていることを書いたにすぎませんし、csv2table という優れたライブラリを教えていただき、とても感謝しております。


「~/Music」にディレクトリ「~/Music/RadioList」を生成させて、「radio_list.txt」と同じ階層に置く様にして見ます。


AppleScript、Shell Script、HTML にパスを記入するので、複雑にするとミスをしやすくなります。なるべくシンプルにした方が良いです。イメージとしては一つのプロジェクトと考えると良いのではないでしょうか。


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

htmlに;


•「-l相当の行数の入力窓」を、

•「-sの検索語の入力窓」を用意して、

•これらがダブル・クリックしたら再表示する。

•終了ボタンも欲しいかも。


といった仕組みが必要性ではないかと思い至りました。


シェルスクリプトを使わず、Javascript のみで実現するのが究極のゴールだと思います。ここから先は、ご自身の力で頑張ってください。あれだけのシェルスクリプトが書けるのですから Javascript もきっと書けるようになると思います。


とはいえ、


せっかく書いたのですが、.appにするとオプションの入力が出来ないので愕然としました。


ではがっかりでしょうから、引数を入力できるようにしてみました。当面はこれで凌いでください。なお、radioListView は「~/Music/RadioList」に置くことを前提にしてます。あとは適宜変更してください。


on run     -- property     set dname to (path to music folder) as text -- $HOME/Music     set fname to "radio_list.txt"     set full_path to dname & fname -- $HOME/Music/fname     try         -- iTunes         tell application "iTunes"             set track_name to name of current track             set stream_title to current stream title             if stream_title is missing value then return         end tell         -- me         tell me             do shell script ("                 ymd=$(date '+%Y-%m-%d-%H%M%S')                 trc=" & quoted form of track_name & "                 res=" & quoted form of stream_title & "                 lst=" & quoted form of fname & "                 cd " & quoted form of (POSIX path of dname) & " &&                 echo \"${ymd}\\t${trc}\\t${res}\" >>\"${lst}\"             ")             set opt to my set_opt()             do shell script ("                 \"$HOME/Music/RadioList/radioListView\" " & item 1 of opt & " " & item 2 of opt & "             ")         end tell     on error err_msg         return err_msg     end try end run on set_opt()     -- set -l option     set btn1 to "オプションなし"     set ary to {1, 3, 5, 7, 9}     set opt_arg1 to choose from list ary ¬         default items (item 4 of ary) cancel button name btn1     if opt_arg1 is false then         set opt_l to ""     else         if (item 1 of opt_arg1) as text is (last item of ary) then             set opt_l to ""         else             set opt_l to "-l" & (item 1 of opt_arg1) as text         end if     end if     -- set -s option     set btn2 to "オプションなし"     set btn3 to "OK"     set msg1 to "検索語を入力してください。"     set opt_arg2 to display dialog msg1 ¬         default answer "" buttons {btn2, btn3} default button btn3     if text returned of opt_arg2 is "" then         set opt_s to ""     else         set opt_s to "-s" & quoted form of (text returned of opt_arg2)     end if     return {opt_l, opt_s} end set_opt

2013/05/26 20:23 Hiro__S への返信

Hiro.S さん:

私も mNeji さんと同じ単なるユーザです。たまたま知っていることを書いたにすぎませんし、csv2table という優れたライブラリを教えていただき、とても感謝しております。


これも、なんちゃって「Quick Look」のお陰かと思うと、運が良かったですね、我々は。



AppleScript、Shell Script、HTML にパスを記入するので、複雑にするとミスをしやすくなります。なるべくシンプルにした方が良いです。イメージとしては一つのプロジェクトと考えると良いのではないでしょうか。


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



はい、了解いたしました。この設計図を念頭において纏めてみます。此れまで、ほとんど単一のbashしか作った事が無いので大分梃摺りそうです。簡易インストーラを作るのが楽な気もします。



ではがっかりでしょうから、引数を入力できるようにしてみました。当面はこれで凌いでください。なお、radioListView は「~/Music/RadioList」に置くことを前提にしてます。あとは適宜変更してください。


わっ、「引数込みのAppleScript関数呼び出し」と「shへの引き渡し」ですか! こんな感じなのですか、じっくりと咀嚼させていただきます。


なお、テストの為に、「~/Desktop/myMusic」の配下で、テストのプロジェクトを試したいと思います。ついては、お手数ですが、

    -- property    
     set dname to (path to music folder) as text -- $HOME/Music
をどの様に変更すれば宜しいでしょうか? 時間のある時にお教え下されば幸いです。



話が逸れますが、リストの表示をSafariにしていたのですが、通常のインターネット・ブラウズのViewとの切り替えが面倒なので、Caminoをリストの表示専用にしました。ウィンドウもコンパクトですし、位置も事実上固定なので爽快に使わせて戴いてます。ブラウザは素人の表現手段としては面白いツールですね。


Firefoxですが、最近は開発環境が組み込まれている様ですね。自分は、この数日、SafariのDevelopに指を出していたので、どうしようかと思っています。贅沢な話ですが……。

2013/05/26 22:40 mNeji への返信

なお、テストの為に、「~/Desktop/myMusic」の配下で、テストのプロジェクトを試したいと思います。


親フォルダを移動/リネームしても動くようにしました。radio_list.txt と radioListView と AppleScript を同一フォルダに置いてください。


また、シェルスクリプトに記述するパスも相対パスにすると良いでしょう。そうすると親フォルダごとどこにでも動かせます。


(* =============================== main =============================== *) on run     try         -- iTunes         tell application "iTunes"             set track_name to name of current track             set stream_title to current stream title             if stream_title is missing value then return         end tell         -- me         tell me             set dname to my get_dirname()             set fname to "radio_list.txt"             set opt to my set_opt()             do shell script ("                 ymd=$(date '+%Y-%m-%d-%H%M%S')                 trc=" & quoted form of track_name & "                 res=" & quoted form of stream_title & "                 lst=" & quoted form of fname & "                 cd " & quoted form of (POSIX path of dname) & " &&                 echo \"${ymd}\\t${trc}\\t${res}\" >>\"${lst}\"                 ./radioListView " & item 1 of opt & " " & item 2 of opt & "             ")         end tell     on error err_msg         return err_msg     end try end run (* ============================ subroutine ============================ *) on get_dirname()     tell application "System Events"         return path of container of (path to me)     end tell end get_dirname on set_opt()     -- set -l option     set btn1 to "オプションなし"     set ttl1 to "-l option"     set ary to {1, 3, 5, 7, 9}     set opt_arg1 to choose from list ary ¬         default items (item 4 of ary) ¬         cancel button name btn1 with title ttl1     if opt_arg1 is false then         set opt_l to ""     else         if (item 1 of opt_arg1) as text is (last item of ary) then             set opt_l to ""         else             set opt_l to "-l" & (item 1 of opt_arg1) as text         end if     end if     -- set -s option     set btn2 to "オプションなし"     set btn3 to "OK"     set msg1 to "検索語を入力してください。"     set ttl2 to "-s option"     set opt_arg2 to display dialog msg1 ¬         default answer "" buttons {btn2, btn3} default button btn3 ¬         with title ttl2     if text returned of opt_arg2 is "" then         set opt_s to ""     else         set opt_s to "-s" & quoted form of (text returned of opt_arg2)     end if     return {opt_l, opt_s} end set_opt

2013/05/27 09:51 Hiro__S への返信

Hiro.S さん、


全て動作する様になりました、ありがとうございました。


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


スジュリプト、radioListViewがまだ絶対パスに成っていますが、相対パスにするのは問題なかろうとおもいます。


さて、実際に動かすと、音楽を聴いていてリストが取りたい時にはオプションは固定(-l7)で取りたいと思う様になりました。


ついては、心苦しいのですが、折角導入し手戴いたサブルーチン、set_opt()呼び出しと、スクリプト呼び出し;



                ./radioListView " & item 1 of opt & " " & item 2 of opt & "


を、「./radioListView -l7」に固定したいのです。申し訳有りませんが、宜しくお願いします。



なお、引数付きのシェル・スクリプトの呼び出しはサンプルが少ないので、後ほど細かく触って参考にさせていただきます。

2013/05/27 20:13 mNeji への返信

「./radioListView -l7」に固定したいのです。


変更は二カ所。次のようにしてください。


./radioListView -l7 " & item 1 of opt & "


on set_opt()     -- set -s option     set btn2 to "オプションなし"     set btn3 to "OK"     set msg1 to "検索語を入力してください。"     set ttl2 to "-s option"     set opt_arg2 to display dialog msg1 ¬         default answer "" buttons {btn2, btn3} default button btn3 ¬         with title ttl2     if text returned of opt_arg2 is "" then         set opt_s to ""     else         set opt_s to "-s" & quoted form of (text returned of opt_arg2)     end if     return {opt_s} end set_opt


ただ、直近の「n」項目に固定すると、リストの前の方が常に見られなくなるので、使い勝手が悪くなると思いますよ。折角連番と取得日時まであるのですから、ブラウザ上でソートすれば済むのでは?


常に直近のものから順番に見たいというのであれば、シェルスクリプトでリストの天地をひっくり返すのも一法かと思います。


AppleScript でダイアログに二回入力するのが面倒...というなら同感。do shell script で Ruby Cocoa を使えば一度に二つとも入力できるダイアログを作ることもできますが、そこまでする必要はないかなと。


私もこの数日間あれこれ試しましたが、リストを全部ブラウザに表示して検索窓から絞り込むのが最も使いやすかったです。シンプルに下図のような感じにしようかと考えてます。


「mart で検索 → data をソート」

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

2013/05/27 22:27 Hiro__S への返信

Hiro.Sさん:


変更は二カ所。次のようにしてください。


どうも有り難うございます。自分用の版として使わせていただきます。




ただ、直近の「n」項目に固定すると、リストの前の方が常に見られなくなるので、使い勝手が悪くなると思いますよ。折角連番と取得日時まであるのですから、ブラウザ上でソートすれば済むのでは?


常に直近のものから順番に見たいというのであれば、シェルスクリプトでリストの天地をひっくり返すのも一法かと思います。局の


表現が巧く出来ないのですが、このAppleScriptを使う主な場面は、何か作業中に聞いていたストリーミング・ラジオの局や曲が四里t'意’場合、とっさにリストできて、しかも本来の作業を進めるような状況です。ぱっと見でも、一行に表示されていると、とても記憶に残る様です。もちろん、時間が取れたら、オフラインで、ターミナルから「radioListView」を駆動して検索を楽しんでいます。


検索は予想外に面白いので、色々と工夫をすると良さそうですね。自分としては、「複数検索語の積」とか「検索に一致した語の着色」を実装したですが、jQueryのplug-insに有るのではなかろうかと期待しています。



AppleScript でダイアログに二回入力するのが面倒...というなら同感。do shell script で Ruby Cocoa を使えば一度に二つとも入力できるダイアログを作ることもできますが、そこまでする必要はないかなと。


> ダイアログに二回入力するのが面倒...


どんズバリです。


> Ruby Cocoa を使えば一度に二つとも入力できるダイアログ


うっ、そういう手も有りますか。自分としてはjQueryのplug-in頼みにできればと、狸の皮算用をしています。



私もこの数日間あれこれ試しましたが、リストを全部ブラウザに表示して検索窓から絞り込むのが最も使いやすかったです。シンプルに下図のような感じにしようかと考えてます。


ここら辺は、実際にトライ&エラーで実用的なのが見つかりそうですね。



「mart で検索 → data をソート」


おお、これは凄いですね。この検索語が込みのデータ自身も保存できると面白いかも知れませんね。

2013/05/28 21:14 mNeji への返信

宿題の一部を実装した、radipListViewです;


•相対パス

•lオプションの入力間違いの対策


を付けました。バグの可能性はあります。



#!/bin/bash



####################################################################################

#

# radioListView:

# 関連ファイル

# • List_View.app(AppleScript)

# • 生成ファイル: radio_list.txt

# • 呼び出し: radioListView

# • radioListView(bash script) [-l lineNum] [-s searchWords ]

# • 生成ファイル: Radio_List.tsv

# • 呼び出し: Radio_List.html

# • 利用: jQuery, jquery.csv2table.js

# • 呼び出し: Radio_List.tsv

# 経緯

# 1) Appleサポート・コミュニティの「Mac min」のディスカッションで、Hiro.Sさんから;

# Terminalから複数の画像(png)を「Quick Look」で開くには?

# https://discussionsjapan.apple.com/thread/10129125?tstart=0#

# 2) ストリーミング・ラジオを来ている時に、其の曲情報をリスト形式で保存して、

# オフラインでそのリストを見たいという願いに対し;

# •iTunesRadio_myList.appの原型(Hiro.S作、AppleScript)

# 「2013/05/12 14:18」に公開

# •iTunesRadio_myList.app → List_View.app

# 3) リスト・ファイルを jquery.csv2table.jsで奇麗に書けそうという話から、

# またもHiro.Sさんから明快な使用法のご説明を戴きました;

# 「2013/05/21 12:22」。

# 4) Hiro.Sさんから修正方針:「2013/05/24 11:05」

# 5) List_View.appの更新: May 27, 2013 2:40 PM

# •オプション入力追加, •相対パス化

# 6) プロジェクト構造を確定: May 28, 2013 1:51 AM

# 7) radioListViewの更新: 2013-05-29(水) 13:10頃

# •lineNumの入力処理向上、•相対パス化

#

# 制作: Hiro.S, mNeji

#

####################################################################################





# set -x



# dirs 相対アドレッシング

rlt="./"

dat="${rlt}data/"

# files

org="${rlt}radio_list.txt"

mid="${dat}radio_list.mid.tsv"

mid2="${dat}radio_list.mid2.tsv"

res="${dat}Radio_List.tsv"



# browser for display List

brw=Camino



#2桁の数字; 00~99

nn="[0-9][0-9]"



# getopts: 入門UNIXシェル・プログラミング、p143~

#

# radioList_setup [-l lineNum] [sortingWords]

# lineNum: "line number" in tail command >=1, lineNum=0 → whole table.

# sortWords: use in grep command



lineNum=0

searchWords=""



while getopts l:s: OPT

do

case $OPT in

l) lineNum=$OPTARG;;

s) searchWords="$OPTARG";;

\?) echo "Usage: $0 [-l lineNum] [-s sortWords] parameters" 1>&2

exit 1;;

esac

done



#

# Headings of Table for List of Streaming Radios

#

echo -e " # \t date-time \t Music Stations \t music information" > $res



#

# add absolute Sequencial Number

#

# 「-HHMMSS\t」→「-HH:MM\t」

#

t=$'\t' # tab character

cat -n $org | sed -e "s/-\($nn\)\($nn\)\($nn\)${t}/-\1:\2${t}/" > $mid





#

# searchWords with grep

#

if [ "$searchWords" = "" ]

then

# no search

cp $mid $mid2

else

# search with "$searchWords"

cat $mid | grep "$searchWords" > $mid2

fi





#

# lineNum check & pull out lineNum

#



# numeric check(ref.: 入門UNIXシェル・プログラミング 改訂第2版、ブルース・プリン、ISBN:4-7973-2194-4, p187)

expr "$lineNum" + 1 > /dev/null 2>&1

if [ $? -lt 2 ]

then

# $lineNum is numeric

:

else

# $lineNum is numeric, force to 0

lineNum=0

fi





if [ $lineNum -eq 0 ]

then

# no tail 1

cat $mid2 >> $res

elif [ $lineNum -gt 0 ]

then

# do tail

cat $mid2 | tail -n $lineNum >> $res

else

# do head

lineNum=$((-lineNum))

echo "lineNum=$lineNum"

cat $mid2 | head -n $lineNum >> $res

fi



#open -a Camino ${HOME}/Sites/myJS/Radio_List.html

open -a $brw "${rlt}Radio_List.html"



rm -f $mid $mid2


2013/05/29 04:10 mNeji への返信

まず、制作:Hiro.S, mNeji から私の名前を削除してください。お気持ちはありがたいのですが、これは私の書いたコードではありません。


それと、冒頭コメントは、何年か後にこのファイルを開いた際、どのようなものかがぱっと見て分かれば良いので、「経緯」を書くなら別ファイルにした方が良いです。コメントとはいえ、なるべくシンプルにしましょう。


さて、内容ですが...


相対パス: なぜこんな書き方に...。ここは、無理をせず絶対パスに戻しましょう。


numeric check: expr コマンドの部分はこれで良いと思いますがその後が冗長です。if 文で「2 未満の場合...」ではなく「2 以上の場合...」とするともっと簡単にできます。あるいは case 文でも良いでしょう。


また、判別文はオプション解析の後でも良いのですが、中に突っ込んだ方が分かりやすいかなと。時間があるときにでも研究してみてください。いずれにせよ、もっとシンプルに書けるはずです。


中間ファイルの削除: 変数をダブルクォーテーションで括りましょう。くどいようですが、何度でも書きます。また、なぜ -f オプションなんて強力なものを付けるのでしょうか?事故どころか大事故の原因になりかねません。


それと、一時ファイルの扱いにはそれなりの書き方があります。これも後日研究してみてください。当面は前回どおり「削除せず」で良いと思います。


ん〜。なんか失速してしまった感がありますね。一つずつじっくり時間をかけて (半年なり一年かけるつもりで) 書き直してみてください。


素性の良いスクリプトだったので、私もちょっと余計なことを書いてしまったかもしれません。

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

Terminalから複数の画像(png)を「Quick Look」で開くには?

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