今回は大量の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
はファイル名の一覧を標準入力から受け取ってそのファイル一覧を任意のコマンドに引数として渡すコマンドです。
今回はawk
にfind
コマンドでヒットした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に置き換えて実行してください