Foltia with AppleScript

Foltia animelockerのトラブルシューティング

do shell scriptでshellを使おう-2:アップルスクリプト

日付関数

以前phpが使えたときはstrtotimeコマンドが使えたので非常に扱いが楽だった気がします。

set d_ to "1966/5/30"

return do shell script "php -r " & quoted form of ("date_default_timezone_set('Asia/Tokyo');echo date('Ymd', strtotime(" & quoted form of d_ & "));")

結構いろいろなフォーマットの日付の入力もstrtotime関数を使うとかなり正確に日付に変更してくれてました。 今はphpを使うには別途phpをインストールする必要があるので面倒なのでdate関数を使います。

その前にアップルスクリプト上でも日付を扱う関数はあって。

current date

-->date "202438 金曜日 14:39:51"

 

date ("202438 金曜日 14:39:51")

--> date "202438 金曜日 14:39:51"

 

date ("2024/3/8 14:39:51")

--> date "202438 金曜日 14:39:51"

 

return hours of (current date)

--> 14

こんな感じで日付を扱えるのですが、戻り値で時間や分だけを取りだそうとすると長文になりますし、どうも少し実行時間が長い気がして、今はdo shell scriptを使うことが多いです。

Shellを使う際、マックのdo shell scriptで使うdate関数はちょっとだけお堅かった気がします。

オプションなどはこちらが結構まとまってました。

たとえばこのリンクの下の方に-d '1 day' とかの一日前とかの記載がありますが、そういうファジーな指定はマックでは受け付けてくれないです。

まず基礎からいくと、現在の時間をフォーマット通りに表示するなら

return do shell script "date +'%Y-%m-%d-%H:%M:%S'"

-->"2024-03-08-15:44:49"

 

こんな形で計算できます。 

一方でフォーマットを変えるには一度 -j で日本時間を指定、-f で入力フォーマットを指定して入力させ 最後に出力先のフォーマットを+の後に記載させます。 入力フォーマットがちょっとでも違うとエラーが出るのがとても堅いですが、プログラムは本来そういうものなんだろうなと思うんですよ。 

set d_ to "19660530"

return do shell script "date -j -f '%Y%m%d' " & quoted form of d_ & " +'%Y/%m/%d'"

-->"1966/05/30"

 

それから引き算や足し算するには -vオプションで -v(+ or -)1d とか記載してゆきます。

set d_ to "19660530"

return do shell script "date -v-1d -j -f '%Y%m%d' " & quoted form of d_ & " +'%Y/%m/%d'"

-->"1966/05/29"

 

こんな形で計算してゆくことができます。 ちょっと長くなりましたね。

ファイル指定方法、String形式, alias形式, unix path(Posix path)形式, Finder形式

これについては、ザリガニが見ていた先生の解説がとても詳しくてよいです。 毎回迷ったらこれを見に帰ってます。

ファイルの位置をアップルスクリプト内で指定する方法は4つあります。

String形式

set F to ((((path to desktop folder from user domain) as string))) & "Folder:"

-->"Macintosh HD:Users:xxxx:Desktop:Folder:"

Alias形式

F as alias

--> alias "Macintosh HD:Users:xxxx:Desktop:Folder:"

POSIX path形式

F's POSIX path

-->"/Users/xxxx/Desktop/Folder"

Finder形式

tell application "Finder" to folder "Folder" of folder "Desktop" of folder "xxxx" of folder "Users" of startup disk

Finder形式は長いのであまり使わないですし、Tell application "Finder"の中でしか確か使えなかったと思います。 Aliasは"Finder"行以外でも記述出来ますし、移動後もフォーローしてくれるみたいですが、alias指定する際にファイルが存在していないとその場でエラーが出ます。 Stringはそのままではファイル指定できませんが、Tell application "Finder" to tell folder str みたいに、ファインダー上でフォルダをして実行する時にはStringですかね。 

これだけ多いと皆さん混乱しますよね。マックの上ではディレクトリーの区切りはコロン(:)を使います。Linuxはスラッシュですね(/)。

 

全角半角の混在したテキスト処理が弱い

sedなどで有名なHTMLタグを除去するものに

sed -e 's/<[^>]*>//g'

ってありますよね。 これ、全角と半角が混在したテキスト上で処理すると、2バイト文字と1バイト文字が混在するために、場合によってはバイトが1個シフトしてうまく半角文字を認識してくれなかったりする場合があります。 

set str to "0105-1300_シネマ「ウエスタン」<字幕スーパー><レターボックスサイズ> チャールズ・ブロンソンヘンリー・フォンダ共演、マカロニ・ウエスタン_TS_-856"

do shell script "Echo " & str & "|sed -e 's/[^]*//g'"

--"0105-1300_シネマ「ウエスタン」<字幕スーパー><レターボックスサイズ> チャールズ・ブロンソンヘンリー・フォンダ共演、マカロニ・ウエスタン_TS_-856"

うまく動作してないですね。こういった場合、sedのまえにLC_CTYPE=UTF-8 と宣言することでバイトシフトがなくなりきちんと期待した動作をすることができます。

do shell script "Echo " & str & "|LC_CTYPE=UTF-8 sed -e 's/[^]*//g'"

--"0105-1300_シネマ「ウエスタン」 チャールズ・ブロンソンヘンリー・フォンダ共演、マカロニ・ウエスタン_TS_-856"

 

ちょっとした小技ですね。

フォルダ・ファイル名などで、濁点があるとうまくgrepsedで拾ってくれない

これは、しばしば経験しますね。 Macは濁点があると余分なコードがついてくるみたいです。 これもザリガニが見てたさんのこのリンクに詳細に解説があります。


結論からいうと

cat '入力ファイル' | iconv -f UTF-8-MAC -t UTF-8

こんな感じでiconv -fで UTF-8-MAC形式を UTF-8に変換して使うことで期待した感じに動作します。 これ結構私も悩んでこのリンクにたどり着きました。 今は大体lsで拾ってきたマックのDirectry名などはiconvしてます。