ラベル ZIP の投稿を表示しています。 すべての投稿を表示
ラベル ZIP の投稿を表示しています。 すべての投稿を表示

2012年9月22日土曜日

ターミナルから無圧縮ZIPファイルを作る

少し前の記事で、Automatorでシェルスクリプトを実行するという内容の記事がありましたが、無圧縮ZIPファイルをどのようなコマンドで作っているか書いていませんでした。その記事へのアクセスが結構多いようですので、実際にZIPファイルを作っている部分を書いてみます。エラーチェック等は省略して、肝心の部分は以下のような感じになっています。

zip -r -n ".jpg:.JPG:.jpeg:.JPEG:.gif:.GIF" "$zipf" "$zipd" -x ".DS_Store"

-r オプションは、ZIPの入力ファイルにディレクトリがある場合、再帰的にたどっていくことを指示します。
-n オプションは、引数として与えられた拡張子を持つファイルを、圧縮しないように指示します。tiffやpngも入れてもいいかもしれません。大文字小文字の違いを無視できればよいのですが、ちょっと冗長になっています。私は、テキストファイルなどは圧縮したいので、このオプションを使っています。
-nオプションの代わりに、-0オプションを使えばすべてのファイルが無圧縮になります。-# (#は0から9の数字が入ります)の形式のオプションは、圧縮スピードを相対的に指定するのですが、-0は無圧縮の指定になっています。-0の方が無圧縮ファイル作成の目的に合う人はこちらの方がよいと思います。
$zipfは、作成するZIPファイル名が入った変数です。
$zipdは、作成対象のディレクトリ名が入った変数です。両方共ダブルクォーテーションで囲んであるのは、文字列中にスペースがあるとシェルが別々の引数として処理するため、予防的に入れています。
最後の-xオプションは、ZIPの対象としないファイルを指定します。.DS_StoreはFinderが不可視ファイルとして作る場合がありますが、今回はZIPファイルに含める必要はないため除外するようにしています。

zipコマンドの詳細はターミナルからmanコマンドで調べることもできます。

2012年9月5日水曜日

Automatorでシェルスクリプトを実行する [追記あり 2012/9/22]

インターネットで拾った画像を、自作のシェルスクリプトでフォルダごと無圧縮ZIPファイルとしてまとめたりしていました。でも、Terminalからコマンド操作するのが面倒なときがあります。
そこで、Finderで選択した項目を個別にZIP化(非圧縮)してくれるアプリケーションを、Automatorで作ってみました。実際は、自作のシェルスクリプトを呼び出すだけですが、少し試行錯誤をしました。[追記: 2012/9/22 無圧縮ZIPをターミナルで作成する記事を書きました]
Automatorを起動してアプリケーションを選択します。そして、ライブラリのFinderから「選択されたFinder項目を取得」を選び右側の領域にドラッグアンドドロップします。
次に、ライブラリのAutomatorから「シェルスクリプトを実行」を選び先ほどの項目の下にドラッグアンドドロップします。
そして、シェルは今回は/bin/bash、入力の引き渡し方法は「引数として」を選びます。
スクリプトのウィンドウには、渡されたFinder項目を"$f"としてechoするスクリプトが記入されていますので、それを自作のコマンドに置き換えます。
適当な画像フォルダを選択して、このワークフローの実行ボタンを押したら、以下の警告ダイアログが出ました。テスト時には別のアクションを入れて、実際に使うときは取り除けと出ていますが、OKすると選択したフォルダがZIPファイルに変換されました。
出来上がったZIPファイルを見たのですが、フォルダの階層がトップから含まれています。これは邪魔です。

そこで、スクリプトを以下のように修正しました。
ループ中で、Finder項目のUnixパス名から、ディレクトリ部分とZIP化対象部分を取り出しています。次に、ディレクトリに移動してからZIP化対象部分だけをシェルスクリプトに渡しています。今度は、ZIP化対象部分以下だけがZIPファイルに含まれていました。

これで基本機能を確認できたので、ワークフローをアプリケーションとして保存し、そのアイコンにフォルダをドラッグアンドドロップしたのですが、実行される気配がありません。Dockの対応アイコンを右クリックすると「アプリケーションが応答しません」と薄い字で表示されています。仕方がないので強制終了しました。その後、ウェブで調べるとどうもワークフローの先頭の「選択されたFinder項目を取得」はいらないようです。
上のように「シェルスクリプトを実行」だけを残して、アプリケーションとして保存し直したところ、ドラッグアンドドロップで動作するようになりました。

関連記事: シェルスクリプトをMacのアプリケーション化するシェルスクリプト