Macで右クリックから暗号付きzip
ちょっと前まで7zipのGUIで暗号付きzipしてたんだけど、10.15(Catalina)になったら使えなくなった。調べたらターミナルからコマンドを打ってあーだこーだすればできるとのこと。
そんなの、、、めんどくさいとしか言えない!!
なので、スクリプト的な物を右クリックのショートカット から実行できないかなと思って調べて作った話。Windowsでいう、.batファイルを作ってショートカットをsendtoに入れる、ということ。
結果的には最低限のものはできたけど、もうちょっとなんとかしたいところ。パスワードをハードコーディングするのは嫌だ。
Automatorで新規クイックアクション
まず、LaunchpadからAutomatorを起動。どこにあるのかわからないけど検索すると出てくる。(←ちゃんと探せばある)
起動すると開くダイアログが出るのでそっと閉じて、メニューからファイル>新規でクイックアクション。クイックアクションとは、アイコンを右クリックするとある物で、今から作るプログラムのショートカット がそこに入る感じ。以前のバージョンではサービスという名前だったみたい。歯車のアイコンは変わりません。
そうするとよくある真っ白な画面は出ず、ライブラリの中からどれを選ぶ?という状態になっている。これは、Automatorというのは既存の部品を組み合わせてやりたいことを自動化しましょう〜という物なので、全部最初から作る必要はないのですね。
でも逆らって、AppleScriptを実行のアイコンをドラッグして右の広いエリアへドロップ。普通のアーカイブを作成だとパスワードを入れられないので。ちなみにシェルスクリプトを実行でも同じようなことはできるし、その方がググった情報は多いと思う。Linuxとかでも使う物だから。今回私は、AppleScriptに触れてみたかったのであえてAppleScriptで。
AppleScriptのコーディング
作るものの下地はできたので、諸々入力していきます。
まず一番上のワークフローの全体設定のようなところ。
1. ワークフローが受け取る項目:ファイルまたはフォルダへ変更
2. 検索対象:Finder.appへ変更
次にようやくコーディング。結果的に書くと下記の通り。(省略しすぎか)
ちなみに複数行コメントは(* 〜 *)で、1行コメントは # 〜 の模様。
処理内容はコード内にコメントを入れておきました。
on run {input, parameters}
(* Your script goes here *)
# 書いたところ ----- ココから -----
# 右クリックで選択した複数の要素分、ループ
repeat with obj in input
# display dialog ("[" & obj & "]")
# 親フォルダとファイル名を取得
# ファイルオブジェクト(obj)の親、名前は、Finderに聞く必要があるため
# tell application 〜 を使う。
tell application "Finder"
set parent_dir to (parent of obj)
set file_name to (name of obj)
end tell
# HSFをPOSIXへ変換
# HSFは、コロン区切りのパス。
# POSIXは、スラッシュ区切りのパス。
# zipのコマンドを使う際に、スラッシュ区切りで使用したいため、POSIXへ変換している。
set obj_path to (POSIX path of obj)
set parent_path to (POSIX path of (parent_dir as string))
# 作成するzipファイルパス
# 本当は、元の拡張子を抜いて、.zipとしたいけど、
# フォルダかファイルか、また、ファイルの場合に拡張子があるかないか、
# 判断する処理が必要。それがめんどくさいから.zipをつけるだけにしておいた。
# どうしても欲しくなったら頑張る。
set zip_path to (obj_path & ".zip") # めんどくさいからこれでいいや
#display dialog zip_path
# 確認
(*
display dialog ("[" & obj_path & "]")
display dialog ("[" & parent_path & "]")
*)
# カレントフォルダをドロップしたファイルのフォルダへ移動するコマンド
# zipするとき、圧縮対象のファイルをパス付きで渡すと、
# zip内にそのパスも作られちゃうので、
# ファイル名だけ渡せばいいように、カレントフォルダを移動する。
set command_cd to "cd " & parent_path
# zipコマンド
# パスワードはここでは固定の「mypassword」。当たり前だけど、ハードコーディングは本当はよくない。
# 「テキストの入力を求める」っていうアクションを使えばできそう。
# けどちょっとやってみたけどまだわからないのでハードコーディングで。
set command_zip to "zip -r -P mypassword " & zip_path & " " & file_name
# コマンド全体
# cdとzipを一度にやらないと、カレントディレクトリが移動しないし、
# zipに-bで実行ディレクトリを指定しても無視されて、圧縮対象がないと言われるため、
# ;で区切って一度に実行する。ちなみに | だとだめ。
set command_str to command_cd & ";" & command_zip
#display dialog command_str
do shell script command_str
end repeat
# 書いたところ ----- ココまで -----
return input
end run
我ながら適当です。特にパスワードのハードコーディング。ここはコメントに書いた通り、「テキストの入力を求める」を使えばいいのかもしれないけど、ちょっとやってみても入力後の値をどう渡せばいいのかわからなかったのでやめた。あとパスワードは「*****」とかって入力したいけど、「テキストの入力を求める」は平文だったというのもある。みんなどうしてるんだろう。
何にしても作るのはこれで一時終了。保存。
実行
Finderを開いて、アイコンを右クリック>クイックアクションを開くと、保存した名前の物があって、選択すると実行される。はず。
ちなみに作った物の実体は、とあるフォルダに入ってる。アップルマーク>システム環境設定>キーボード>ショートカット >サービス>ファイルとフォルダ>作った名前を右クリックすると、フォルダを開ける。深いわ。そこからファイルを消せば、右クリックのクイックアクションからも消える。
感想
AutomatorもApple Scriptも初めてやってみたのだけれど、どちらもネットに情報が少なすぎる。Appleの公式資料にもたどり着けない。(あるのか?)特にAutomator自身の使い方と、既存のライブラリの使い方を知りたかった。あまりやってる人がいない模様なので注意。Apple Scriptの部分は、その代わりにシェルを使った方がハードルが1つ減っていいかもしれない。
ま、とりあえずできたからいいか。