kick the base

Houdiniと、CG技術と、日々のこと。

Illustrator: 複数のファイルから特定のバージョンで保存されたaiファイルを出力する

今回は大量のaiファイルから特定のバージョンで保存されたファイルを列挙する方法について書きます。

例えばフォルダの中にあるCS5バージョンで保存したaiのみを納品したいんだけど、ひとつづつ調べるのは大変なんてときに役に立つかもしれません。

執筆時の環境

Mac

  • Adobe Illustrator CC 20.1.0 (現時点の最新バージョン)
  • OSX 10.9.5

Windows

Windowsについては検証していませんが、下記方法で本記事の内容は試せるかと思います。

  • Bash on Ubuntu on Windows上でawkを起動する(開発者モードに変更する必要あり)
  • Windows版gawk.exeを利用する*1

背景

Macであればファイルを選択して右クリックメニュー > 情報を見る(command + I)で保存されたバージョンを確認することができますが、ひとつひとつのファイルをすべてチェックしていくのは効率的ではありません。ファイルが多くなれば確認漏れも発生するでしょう。

こんなとき、コマンドラインを利用することによって確実かつ機械的に処理することができます。自動化できるところはコンピュータにまかせ、クリエイティブな時間を増やしましょう。

原理

テキストエディタでaiファイルを開いてみる

aiファイルを直接開けるエディタ(ここではCotEditor)で開いてみましょう。

まずはIllustrator CC形式で保存したaiで試してみます。文字化けはしていますが気にせず中を見ていくと、こんな箇所が見当たります。

RoundtripVersion 17

ここっぽい。

続けてCS6、CS5...と見ていきます。まとめると下記のような結果になりました。

保存形式 RoundtripVersion
Illustrator CC 17
Illustrator CS6 16
Illustrator CS5 15
Illustrator CS4 14
Illustrator CS3 13
Illustrator CS2 12
Illustrator CS 11
Illustrator 10 10
Illustrator 9 9

ビンゴ。

RoundtripVersionを調べれば一意的にファイルの保存バージョンが定まりそうです。

Illustrator 8以前の保存形式について

実はこのRoundtripVersionを調べる方法は8以前のaiファイルには使えません。Illustrator8以前のファイルにはこの文字列は含まれていないためです。

%%Creator:という文字列を検索することで下位バージョンのデータにもヒットさせることはできるのですが、Creatorは少々ややこしいので今回は割愛します。

フォルダ内のファイルに対して検索を行う

上記の結果により、例えばCS5のファイルをピックアップしたければRoundtripVersion 15にマッチするものを出力させれば良さそうです。

$ cd [調査したいディレクトリ]

まずはターミナルで上記コマンドを実行し、aiファイルが格納されているディレクトリに移動します。

今回はテストとして下記ディレクトリを用意しました。

わかりやすくするため保存形式をファイル名に入れています。また検索の挙動確認用にサブディレクトリ内のtest.txtにはRoundtripVersion 15というテキストを書いておきました。

.
├── sub
│   ├── test-10.ai
│   ├── test-8.ai
│   ├── test-cs.ai
│   ├── test-cs5-02.ai
│   └── test.txt //これの中身は RoundtripVersion 15 というテキスト
├── test-cc.ai
├── test-cs5.ai
└── test-cs6.ai

ここからがメインの作業です。

検索といえば。みんな大好きgrep

まずはバージョンも拡張子も指定せず、RoundtripVersionという文字列だけを検索してみましょう。

$ grep -r RoundtripVersion *

コマンドの意味合いとしてはサブフォルダを含むファイルに対してRoundtripVersionという文字列があればそのファイル名を出力してねというものになります。

出力結果は下記の通りです。

Binary file ./sub/test-10.ai matches
./sub/test.txt:RoundtripVersion 15

...うまくいきませんね。サブフォルダ内のtest.txtには反応しましたが、aiファイルは正しく認識できません。

ここで気を取り直して方向性を変えてみましょう。

awkを利用する

シンプルな文字列操作はawkの得意分野です。やってみましょう。(下記はCS5のファイル名を出力するコマンドです)

awk '/RoundtripVersion 15/ { print FILENAME }' *.ai

出力結果はtest-cs5.aiとなりました。問題なさそうですね。

これでカレントディレクトリ(現在いるディレクトリ)内のaiファイルに対して保存バージョンを一括で調べることができるようになりました。

ディレクトリを再帰的に調査する

せっかくなのでカレントディレクトリ内のサブディレクトリに対して再帰的に走査できるようにしましょう。

find . -type f -name "*.ai" | xargs awk '/RoundtripVersion 15/{print FILENAME}'

出力結果は下記の通りです。

./sub/test-cs5-02.ai
./test-cs5.ai

OK!

以下は簡単なコマンドの解説です。

find

findはファイルやディレクトリを検索するコマンドす。オプションを組み合わせることで様々な検索を行うことができます。

今回使用したオプションは下記のとおりです。

オプション 内容
-type f ファイルを対象とする(ディレクトリは無視)
-name "*.ai" 拡張子aiのファイル名を対象とする
xargs

xargsはファイル名の一覧を標準入力から受け取ってそのファイル一覧を任意のコマンドに引数として渡すコマンドです。

今回はawkfindコマンドでヒットしたaiファイルを渡しましたが、rmコマンドに渡して削除するなんてこともできます。

find . -type f -name "*.ai" | xargs rm

こんな感じです。

注意: rmコマンドで削除したファイルは基本的に復元できません。上記コマンドを実行する際は削除しても良いテスト環境で行ってください。またrmコマンドをゴミ箱へ置き換えるツールを日頃から入れておくのも良いでしょう。

awk

findコマンドから|(パイプ)を使ってxargsに渡し、それを引数としてawkを実行しているので、今回は引数の*.aiは不要になります。

awk '/RoundtripVersion 15/ { print FILENAME }'

まとめ

いかがでしょうか。今回は指定した保存バージョンのaiファイルを標準出力として表示するだけでしたが、その結果を納品ディレクトリに移動させたりコピーさせたりするのも簡単に行えそうですね。

GUIもいいけどCUIもね。というお話でした。

*1:gawkを利用する際はawkコマンドをgawkに置き換えて実行してください