見出し画像

ZIPでファイル圧縮をしよう! 【4】

過去3本の記事を書いて、未だに本題に入っていないというシリーズ。いつの間にやら年まで新しくなり2022年となりましたが、皆様いかがお過ごしでしょうか。

今回はZIP圧縮の実際のアクションを組み立てていきましょう。前回の冒頭で考えたステップに沿ってやってみます。


目的のファイルを選択すると同時に、フルパスを取得

Automator では、ファイルを選択してそれに対して操作をするというアクションを作ることは日常チャメシゴトなので、そのへんは便利にできてます。

ファイルに対して、選択したまま右クリックで適用できるよう、クイックアクションで作ろうと方針を決めました。まずは新規書類をそのように作り開きます。

スクリーンショット 2021-10-22 17.21.32

上の画像、どういうことかというと、クイックアクションは、ファイルが選択された「後」を組み立てていくので、この Automator 上で「実行」ボタンによるテストをすることができないんですよ。

だから、ダミーになるデータ、つまり何かしらファイル/フォルダ(の所在)を、先頭に置いてやる必要があるよと言っているんです。で、完成した後はそれを無効にしてください、と。

では指示されたように、先頭に「指定されたFinder項目を取得」を置きます。そしてその窓に適当なファイルを追加してください。

画像2


自分で決めた変数名とそこへの値の代入、そして取得

まず、オリジナルのファイルのパスを、変数に一度格納、保持しておきます。あとで分解して使うと、おじさんと約束しましたよね。

変数名は、そこに代入される文字列や数値などの値を抽象化したものにしましょう。自分がわかりやすいように。オリジナルのフルパスということで、「origFullPath」とし、Automator で変数を定義します。

前回ちらっと説明したように、右側いちばん下のカラムが変数の一覧を兼ねています。「変数」を表示させてから、空のカラムの上で右クリックして新規変数を作ってください。名前と値をそれぞれ決めるようになっています。名前は先のように。値は空でいいです。

上の画像で一気にやってしまっているのですが、今作った変数に、最初のアクションで決めたファイルのパスを格納できた様子になっています。「変数の値を設定」アクションを左のペインからドラッグして配置したあと、そのアクションの上で、作ったばかりの変数が指定できるようになっているはずです。


さて、どうでしょう。
このアクションでは、オリジナルファイルのパスさえ取得してしまえば、その後どこかから新たに値を拾ってくる必要がないので、あとはこのパスをプランどおりにこねくり回すことで目的は果たせます。

何が言いたいかというと、ここで何気なく重要な概念について説明します。

Automator の処理の流れは、上から下までずっとひと繋がりになっているような「錯覚」を覚えると思うのですが、実は「切り離す」こともできるのだということ。


実際の操作で説明していきますね。
プランどおりにパス文字列を、パス部分と、ファイル名部分に分割して、それぞれを保持しておきます。

変数の命名は、皆さんそれぞれにわかりやすいようにすればいいのですが、ここでは、パス部分を「origPath」、ファイル名を「origFileName」とでもしておきます。

ではこの二つを、さっきと同じように、窓の一番下の「変数」カラムの上で先に作ってしまいます。右クリックで「新規変数」を。プランができていれば、部品はサクサク作れますね。何事も、事前の設計が大事。


「シェルにやらせると簡単」の回想

一言でパスを分割、といっても、どうやったらいいかわからないのではないでしょうか。
たとえば思いつくのは、このパス文字列の末尾から何文字かを数えて、そこでぶった切るというような、あくまでもイメージ。(笑)

でもそれだと固定数になっちゃいますからね。ファイルを選ぶたびに指定しなおさなければならなくなってしまう。

じゃあ、末尾から数えて、パス区切りのスラッシュが出てくる場所までを数える。 ーーー おお、いいセンいってる。

そんな、文字列の出現の「パターン」への一致を検索する、プログラミング的手法があります。「正規表現(Regular Expression)」と言われるものです。省略されて「RE」だとか「RegExp」だとか言われることがあります。

でも正規表現はパターンマッチのための表現形式が独特で、特にプログラミングにあまり慣れていない人は困惑するでしょう。なので、ここではもっと簡単な方法を提示します。

はい、シェルなら一発、です。
やってみましょう。

先ほど、Automator の処理の流れは切り離せると言いました。
続くのはむしろ最初のステップと関係のない操作なので、切り離せた方が感覚的にいいでしょう。(笑)まずそこからやります。

オリジナルのパスは取得済なので、それを参照するために、窓の一番左の「アクション>ライブラリ>ユーティリティ」から探して、「変数を取得」を右側、一番下に配置します。

参照元はといえば、変数「origFullPath」ですね。これがプルダウンで選べるはずです。同時に、自分で作った(まだ空の状態の)二つの変数も見えるはずなので、間違えないように。

それだけやったら、この「変数を取得」アクションの上で右クリックしてください。使用停止、複製、などのメニューの中に「入力を無視」があると思います。それを選択してください。

見た目にも「処理が切れた」ように見えていると思います。
その後、シェルに一度値を渡し、その出力を自分で決めた変数にセット、というステップが繋がります。以下の画像でわかるでしょうか。

「変数の値を取得」

「シェルスクリプトを実行」

「変数の値を設定」

ゲットしてセット。まぁキレイにそのまんまです。
基本的にこのようにして、パス部分とファイル名部分を個別に変数に持っておきましょう。

ここで大事なのは言うまでもなく、シェルに値を渡すこととそのコマンドです。画像を見ておわかりだと思いますが、「dirname」のコマンド。めちゃシンプルですよね!
これにより、パス文字列からパス部分のみを一発で取り出せます。なんと便利なことでしょうか。

「シェルスクリプトを実行」を配置したら、「入力の引き渡し方法」を「引数として」に変更します。こうすると、Automator の操作の流れの中で、上から変数の値が流れ込んできます。

それを受け取る箱となるのが、シェルコマンドの「$1」。これがシェルでいうところの変数(引数)となります。いくつかの変数が同時に渡されたら、$1,$2…とやると各々セットされるというわけ。
「位置パラメータ」で検索すると詳しいことがわかるでしょう。

さてこれでテストできますが、先に、ファイル名部分を取り出す操作も先に作ってしまいましょう。

やり方は同じです。「変数の値を取得」を配置したら、まず操作の流れを切るために「入力を無視」。そのあとはこの3ステップを1セットとして配置します。その際、全てを一つづつ「複製」すると、順次最後尾に配置されるので便利です。そして勿論、最後はファイル名が欲しいので、プルダウンで変数の指定を忘れないように。

シェルスクリプトはどうなるでしょう。
ファイル名部分のみ欲しい場合は「basename $1」となります。そのように書き換えてください。これもなんとこのコマンド「basename」だけ。1行で済むんですよええ。

「変数の値を設定」の「結果」のボタンを押して小窓を開いておいてくださいね。そうしたら実行ボタンを押し、それぞれの窓を確認してください。パスとファイル名に分かれ、うまく表示されていますか?


うまくいったら万々歳。
プログラミングって面白いでしょう? そうでもない?(笑)

割と自分は、こういう基本的なところがうまくいくと楽しかったりします。ちゃんとコンピュータが意図どおりに反応してくれる様子が原体験を思い出させるんですよね。


それはいいとして、おじさんはハタと思ったのでした。

このままだと、アクション全体が「長い」(長くなってしまう)。

今この時点でもそうですが、編集しようと思うと、ずっと下にスクロールしていかないといけなくなるし、今回みたいに似たような操作が続くとひと目では判別しにくい。

と、いうわけで… ひらりと方針転換。(笑)

以上を踏まえ、AppleScript に全部渡して、少ないアクションで完結するようにしましょう。
ここでやった変数定義やゲット/セットのやり方は、今後また役に立つことでしょう。絶対に無駄にはならない(と信じて・笑)。


では次回、組み直して完結! まで… やれたらいいな〜♪



この記事が気に入ったらサポートをしてみませんか?