げぇむぷろぐらみんぐ

日々の生活で得た知識、経験を書きます

Unityによる開発のときに使えるシェルスクリプト入門

はじめに

Unityで、あるスクリプトがアタッチされているPrefabをプロジェクト内からすべて見つけ出したいということがあったときに、Unityエディタの機能だと無さそうだったので先輩に相談しました。 すると、サクッとシェルスクリプトを書いて探し方を教えてくれて、かっけーとなったので僕も勉強してまとめてみました。

長くなってしまったので、今回は便利そうなコマンドのまとめだけになってしまいました。

シェルスクリプト初心者なので、もっとこう書くと簡潔だよとかあればどしどしご指摘お願いします。

使えそうなコマンド一覧

使えそうなコマンド一覧に関してどんなコマンドか紹介と、具体例を記述していきます。 コマンドの引数やオプションに取りうる詳細な情報は割愛します。

find

指定したディレクトリ以下に存在するファイルやディレクトリを再帰的に検索してくれるコマンドです。

例えば、Unityでプロジェクトのルートディレクトリにいるとして、Resourcesの中身一覧を見たくなった場合には以下のようなコマンドでできます。

% find Assets/Resources
  • ファイルだけ表示したくなった場合
% find Assets/Resources -type f
  • .prefabのみ表示したくなった場合
% find Assets/Resources -name "*.prefab"

xargs

標準入力から扱いたいものを受け取って、それを指定されたコマンドの引数に渡すためのコマンドです。 かなりわかりづらいですが、コマンドとコマンド間の仲介役のような感じです。

例えば、先程のfindと組み合わせて、Resources以下のどのディレクトリがサイズが大きいかを調べたくなったとすると以下のようなコマンドでできます。

% find  Assets/Resources -type d | xargs du

上記に関して、-typeの引数にdを指定するとディレクトリの一覧を得ることができます。それによって、得たディレクトリの一覧をディレクトリのサイズを調べるためのコマンドであるduの引数に渡しています。

この例をもとにもっと詳しく説明すると、まずはじめのfindコマンドの結果が以下のようになったとします。

% find  Assets/Resources -type d
Assets/Resources/Sprites
Assets/Resources/Animations
Assets/Resources/Font

これらのfindした結果に対して、ディレクトリのサイズを調べるためには愚直にやると以下のように一つづつ調べることになります。

% du Assets/Resources/Sprites
% du Assets/Resources/Animations
% du Assets/Resources/Font

これと同じように、xargsは標準入力から受け取った結果を直接duに渡してくれているため、一つのコマンドで完結します。

sed

与えられた文字列を指定した処理を加えて標準出力できるコマンドです。 主に読み込んだテキストであったり、入力したコマンドの結果の一部に手を加えたい場合に用います。

例えば、スクリプト内のTestという文字列をTest2に置き換えたくなった場合には以下のようなコマンドでできます。

% sed -i -e s/Test/Test2/g Hoge.cs

上記のコマンドでは、-iオプションによって直接Hoge.csの中身を書き換えています。 Macだと、上のコマンドを実行した場合は、-iのあとをバックアップの拡張子としてバックアップを保存してしまうので、Hoge.cs-eというファイルができてしまいます。 それを防ぐには、バックアップの拡張子を以下のように空にすれば良いです。

% sed -i '' -e s/Test/Test2/g Hoge.cs

また、-iでなく以下のようにすれば、書き換えた結果を他のファイルに書き込むこともできます。

% sed -e s/Test/Test2/g Test.cs

grep

与えられた文字列から正規表現に一致する行を出力できるコマンドです。 あるコマンドの結果を条件によって絞り込んで確認したい場合や、ファイル内に任意の文字列が含まれているかどうかの確認に使ったりできます。

例えば、a.txt内でTestという文字列が含まれる行を調べたい場合は以下のようなコマンドでできます。

% grep Test a.txt

また、今までのコマンド群を組み合わせて、Resourcesフォルダ内にあるPrefabのGUIDを調べるコマンドは以下のようになります。

find Assets/Resources -name "*.prefab" -type f | xargs grep guid

まとめ

よく使いそうなシェルコマンドについて調べてまとめてみました。 普段はgrepくらいしか使っていなかったのですが、これらが使いこなせるようになると簡単なファイルの一括操作などが非常に楽にできるようになりそうなので、ちょっとずつ使うコマンドを増やしていきたいです。