ZIPでファイル圧縮をしよう! 【2】
みなさんこんにちは。既に長くなりそうな予感プンプンのこの題目、2回めであります。
前回は、こちら。シェル(ターミナル)がどういうものか、少しだけ触ってみました。
このシリーズで、Automator を通じシェルにやらせる仕事はZIP圧縮なのですが、そのためのコマンドはたったの1行で済みます。
【書式】
zip [オプション] [圧縮完了時の(新規)ファイル名] [圧縮元のファイル名]
↓
zip [オプション] hoge.zip hoge.txt
例としてはこんな風に打ち込むわけです。「hoge.txt」というファイルを、「hoge.zip」として圧縮。目的とするファイル名を先に。
シェルコマンドの基本的な書式としてはみなだいたいこんな感じです。命令を最初に書いて(今回は「zip」)、その後にオプションや操作対象を、半角スペースを挟みながら並べて書き、最後にリターンキー。
オプションの部分では、ファイルを圧縮するか、ディレクトリ(フォルダ)か、あとはそう、パスワード付きZIPにするか、などが選択できます。これについても最後の方で触れたいと思います。
概要はこんなところです。この操作を、Automator を使ってワンアクションでできるようにしていきます。
ファイルパスの概念
さていきなりですが、シェル(ターミナル)の窓のコマンドプロンプトの付近に、何でもいいのでファイルをマウスポインタでドラッグしてみてください。
/Users/<ユーザ名>/Documents/example.txt
こんな風に表示されたと思います。これ、何だかわかります…よね?
上の例は、ユーザ(自分)の書類フォルダの中の「example.txt」というファイルをドラッグした結果で、「example.txt」までの道筋(ファイルパス)が全て見えているということ。住所のようなものですね。全てのファイル(と、フォルダ)は、その所在をこのように示すことができます。
それを踏まえ。シェルコマンドに目的のファイル名(の所在)を伝える方法は、大きく2通りあります。
一つは、前回みなさんに試していただいたように、シェルの上で、まず目的のファイルがあるディレクトリ(フォルダ)まで cd で移動してから
zip [オプション] [圧縮完了時の(新規)ファイル名] [圧縮元のファイル名]
とやる方法。これなら、ファイル名に(「Documents」までの)パスの部分は要りません。自分がその階(フォルダ)に降り立っているから。文字通りファイル名だけでいいです。
そしてもう一つは、いま上で見てもらったように、完全なパス(フルパス)を指定する方法。これなら、いつどこからでもどこへでも、zip の場合なら zip ファイルを作成できます。
今回は後者をとり、Automator のアクションの先頭で、目的のファイルのフルパスを取得して、同じディレクトリ(フォルダ)に作成するようにしましょう。
アクションの手続きをなんとなくイメージしてみる
見えてきました? 来ない? 笑
この段階では、本当になんとなくでいいので、プログラム的に、どんな操作を積み上げれば目的が達成できるか、イメージしてみます。
コンテキストメニューからファイル(フォルダ)に対して直接実行できた方がスマートですよね。クイックアクションでいきましょう。
まずは、さっき言ったように、目的のファイルのフルパスを取得してこないと話は始まらないので、それが最初のステップ。
おっと待った。ここでは本当にイメージだけです。必要なことを箇条書きにするような感じで。
zipコマンドで、フルパスが必要になると話をしました。
通常のZIP圧縮というのは、元のファイルと同じ場所(フォルダ/ディレクトリ)にできますし、できてほしいですよね。では、最初に圧縮元のファイルを指定する段階で、その場所、フルパスを取得してしまいましょう。そして末尾のファイル名を除いた部分を予め保持しておきます。そう、変数に。
パス部分(の文字列)+ ファイル名(の文字列)
こんな感じで分けて変数に保持しておくとスッキリするかと。
通常、ZIP圧縮をした後のファイル名はどうなりますかね。上のように「example.txt」を圧縮したら「example.txt.zip」でしょうか? 勿論それでもいいのですが、「example.zip」にしましょう。わざわざそうする理由は、敢えてパスとファイル名を分けることからきています。前者の場合なら拡張子「.zip」をパス全体に付け加えるだけでいいのですが、それじゃあ面白くない、と(笑)。
シェルコマンドだと色々と楽になる場合がある
さて、またも脱線するのですが 笑
テキスト加工や生成という面で、シェルにやらせた方が物事簡単に済むということが往々にしてある、という小噺をひとつ。
今回のZIP圧縮は上のように一行でできるわけですが、例えば私の場合、過去にこういうことがありました。
ランダムな数列を、ある桁数に一致させ、かつ 0(ゼロ)が先頭に来てもかまわない(むしろランダムなので出現してほしい)という条件で生成したい。
例えば AppleScript だけを使ってごにょごにょしても勿論できるのですが、シェルだと俗に言う「ワンライナー(1行だけのプログラム)」でできます。
jot -r 1 1000000 9999999 | cut -c 2-7
パッと見ただけでは意味がわからないかもしれませんが、実は単純な構成で、バーティカルバー (「|」)に隔てられた二つのコマンドが、オプション付きで連結されているというだけのことなんです。
シェルコマンドはこのように、「パイプ」と言って、「|」で繋げながら、コマンドの結果を右へ次々に受け渡して加工・整形することができる。このあたりも面白いところです。
「jot」コマンドでランダムな数列を生成し、その結果を「cut」に渡して7桁の後尾を6桁として取り出しています。こう説明するとイメージが掴めるのでは?
勿論私も、それほどコマンドに詳しいわけではなく。笑
調べに調べてここに行き着いたので、もっとスマートなやり方があるかもしれません。
なぜ「cut」を使って6桁に再加工しているかというと、色々やったものの先頭にゼロがうまく出てきてくれなかったから。結果的にこれで上手くいったし、何となくシェルなら簡単にできそうというイメージが最初からあったのですよね。
はい、そんな一例のお話でした。よければ上のコマンドを試してみてください。シェルのプロンプトにコピペできますから、そうしてエンターキー。続けて同じことをするとはてさて。
では次回は、今度こそ(笑)実際のアクションの組み立てに入りましょう。