特定の場所の検索をする [AppleScript辞書はつくれるか?]
ただ特定の場所(フォルダ内)の検索をしたい。それだけ
set |検索先のフォルダ| to POSIX path of (choose folder with prompt "フォルダを選択:")
set |検索名| to text returned of (display dialog "検索する文字を入力してください" default answer "")
do shell script "du -a \"" & |検索先のフォルダ| & "\" | grep \"" & |検索名| & "\" | cut -f2"
(* 1行目 *)
choose filder --を使って検索先のフォルダを選択
ちなみに folderの代わりに「file」や「file name」や「application」や「URL」というのもある。
・オプションで
with prompt "メッセージ" --でメッセージつけられます。
default location |場所| --で最初に表示されるフォルダーを指定できます。
with invisibles --で不可視ファイルも見えるようになります。
with multiple selections allowed --複数選択できる。
POSIX path of ~ --最後の行(3行目)の処理のためには必須のPosixパス形式に変更してます。
Mac Finderで使うファイルパス 例)"HD:Users:myName:Documents:test.txt"
UNIX系 Posix Path 例)"HD/Users/myName/Documents/test.txt"
Windows File パス 例)"C:¥Users¥myName¥Documents¥test.txt"
(* 2行目 *)
display dialog "コメント" --で、検索する文字を入力
--ただ返り値が「ボタン」と「テキスト」の二つ返ってくるので
・オプションで
default answer "初期表示" --で文字入力をすることができる。
buttons {"1","2","3"} --で最大3つまでの好きな文字のボタンを作成できる。
default button |番号orボタン名| --で上記のボタンの中からデフォルトボタンを指定できる。
with icon |整数0~2 または note/caution/stop| --ダイアログのアイコンを変更できる。
giving up after |整数(秒)| -- ダイアログが表示し続けるのを諦める時間を設定できる。
text returned of 〜 --でテキストの返り値のみ取得します。
他に、押されたボタンを知る場合は「button returned of 〜」
ギブアップしたかを知る場合は「gave up of 〜」
で取得できる。
しかし、好きなボタンを指定しないデフォルトなどに表示されている「キャンセル」ボタンは、押すとスクリプトの中断を宣言するために、返り値がなくなります。
(* 3行目 *)
do shell script " 〜 " --でシェルスクリプト(など)を扱えるようにしています。
du 'directory' --は指定した'ディスクやフォルダ'の中身の「使用量」と「ファイルパス」のリストテキストを取得
du -a 'directory' -- 「-a」のオプションをつけることによって、それ以下の階層を全て取得してくれます。
| --通称パイプは前(左)の結果を、後(右)にそのまま引き継ぎ連続して処理が行えます。
grep '検索文字' --検索文字でマッチングした行のみ収集します。
grep '検索文字' 'filePath' -- filePathの書類を読み出してマッチングが行えます。
grep -n '検索文字' --マッチングされた行の番号も表示して取得します。
grep -i '検索文字' --アルファベットの大文字小文字を区別せず検索します
grep -v '検索文字' --検索文字でマッチングした行『以外』を収集します。
注)grepなどテキストを扱う処理ではテキストの改行で注意が必要。
Macでよく使うCR(ASCII character 13)ではうまく処理できないので、
LF(ASCII character 10)を使う必要がある。
cut -f2 --は、duで取得したデータが"容量 ファイルパス"と二つのあいてむが入っているため2つ目を切り出しています。
cut -f|数字| --デフォルトの区切り文字のTABでアイテム分割し番号のアイテムを切り出します。
cut -f|数字| 'filePath' -- filePathの書類を読み出して切り出します。
cut -d '区切り文字' -f|数字| --区切り文字を指定してアイテムも切り分けます。
ちなみに、数字の部分の表記方法は
cut -f2 --2番目のアイテムを切り出し
cut -f1,3 --1番目と3番目のアイテムを切り出し(いくつでも)
cut -f-4 --最初から4番目までのアイテムを切り出し
cut -f2- --2番目から最後までのアイテムを切り出し
cut -f3-5 --3番目から5番目までの全てのアイテムを切り出し
というふうに使える。
そして、「-f」(アイテム単位)を「-b」(バイト単位)、「-c」(文字単位)にも変えて使用できるが、-dはつかえない。
今回のプログラムで、『ユーザーのドキュメントフォルダ』の中身から『apple』という文字が含まれるアドレスを入力した場合は、
do shell script "du -a 'HD/Users/myName/document/' | grep 'apple' | cut -f2"
追記)シェルスクリプトのファイルパスは予約された省略文があります。
上記のように"HD"というハードディスクの中の"myName"というユーザーネームのホームフォルダは、
"HD/Users/myName/"となりますが、他の人が使うことを考えたスクリプトにする場合には、
"~/"と記入するだけで(ログインしているユーザーの)ホームフォルダの代わりをします。
また別に"$HOME/"という書き方もあります。その場その場で使い分けましょう。
ファイルアドレスは必ずしも『'』(シングルクオート)で囲む必要はりません。
アドレスが、スペース無しの『半角英数字記号』のみであれば不要です。
例)do shell script "du ~/desktop/test.txt"
これに当てはまらない場合は、『'』(シングルクオート)または『"』(ダブルクオート)でアドレスの両端を囲まなければいけません。かなや漢字などの2バイト文字はなにが邪魔するかわからないので念のため。
例)do shell script "du '~/desktop/this is a pen.txt'"
do shell script "du '~/Document/書類.txt'"
ダブルクオートを使用する場合は、そのまま使用してはいけないためエスケープシーケンス(バックスラッシュ)を使用してシーケンス文字の一種であるダブルクオートをただの文字扱いに逃がしてやる必要があります。(アップルスクリプトで入力する時点では文字扱いにし、2次的なシェルスクリプトで扱う時点で外れてシーケンス文字になるようにしています。説明が難しい。)
例)do shell script "du \"~/desktop/test.txt\""
ダブルクオートとシングルクオートの違いは?
大きな違いは、シェルスクリプトではシングルクオートではそのまま変化せず適すつつして使用しますが、ダブルクオートはテキストの意味を解釈して使います。
(* テキスト *)
do shell script "echo abc"
--> "abc"
do shell script "echo 'abc'"
--> "abc"
do shell script "echo \"abc\""
--> "abc"
(* 相対アドレス *)
do shell script "echo ~/"
--> "/Users/myName/"
do shell script "echo '~/'"
--> "~/"
do shell script "echo \"~/\""
--> "~/"
(* 特別変数アドレス *)
do shell script "echo $HOME"
--> "/Users/myName/"
do shell script "echo '$HOME'"
--> "$HOME"
do shell script "echo \"$HOME\""
--> "/Users/myName/"
echoは文字を扱うための命令です。
文字を受け取ってどう変化するかがわかると思います。
テキストはそのままテキストで違いはでないですが、相対パスを扱う場合の認識と特別変数パスを扱う場合は違いが出るので、それぞれ都合の良いやり方が必要になりますね。
あれ?
一体何を記事にしてこんなになったんだろう?(ボケ進行中)
コメント 0