Windows 10で動くBashとは
2016年8月2日リリース予定の大型アップデート「Windows 10 Anniversary Update」では、Windows 10上でLinuxディストリビューションの1つ「Ubuntu」が動作する。ロジックなどは次回以降の連載で紹介していくが、エクスプローラーがX Window Systemに置き換わる訳ではない。UNIXの各コマンドがWindows 10上で使用可能になるのだ。Microsoftは「開発者向け」の機能として、「Bash on Ubuntu on Windows(以下、BUW)」を提供すると、2016年5月に開催した開発者向けカンファレンス「Build 2016」で説明している。
本稿を執筆している時点で、BUWを試すにはWindows Insider Programに参加し、Windows 10 Insider Preview ビルド14316以降をインストールしなければならない(ちなみに執筆時点の最新ビルドは14379)。しかし、業務などに使用するPCにWindows 10 Insider Previewをインストールすると、意図しない不具合が発生する可能性がある。
そこで本連載ではWindows 10 Insider Previewを使用し、Windows 10 Anniversary Updateがリリースしてから戸惑わないように、BUWの使い方を紹介していく。なお、Windows 10 Insider PreviewやBUWはRTM(製造工程版)ではないため、お手元のWindows 10 Anniversary Updateと実際の画面や動作が食い違う可能性がある。その際は目の前のPCを優先し、その都度読み替えてほしい。
まずBUWを有効にするには、Windows 10を「開発者モード」に切り替える。Windows 10ではUWP(ユニバーサルWindowsプラットフォーム)アプリケーションをWindowsストアからのみインストールする「Windowsストアアプリ」、職場などで配布するローカルUWPアプリケーションのインストールを可能にする「サイドロードアプリ」、そして自身で開発したUWPアプリケーションの利用やデバッグ、展開を可能するのが「開発者モード」だ。
Windows 10の状態を変更したら、次は「プログラムと機能」から<Windows Subsystem for Linux>を有効にする。Windows 10上でUbuntuを実行するために必要なサブシステムをインストールするプロセスだが、こちらに関する説明も次回以降にさせてほしい。ちなみに「プログラムと機能」は「OptionalFeatures.exe」を実行しても起動できる。
この時点でBUWはインストールされていない。あくまでもサブシステムを有効にした状態だ。ここからbashを起動すると、Ubuntuイメージのダウンロードと展開を行い、好みにユーザー名とパスワードを入力すれば、Ubuntuが使用可能になる。一度「exit」コマンドを実行してBashを終了させておこう。
次回以降はコマンドプロンプトやPowerShellからbash.exeを実行するか、アプリケーションとして登録されたBUWを起動すればよい。ちなみにBUWはUbuntu 14.04 LTSをベースにしており、Linuxカーネルはバージョン3.4.0。Bashのバージョンは4.3.11だ。また、実際のUbuntuと同じくパッケージはapt-getコマンドで自由にインストールできる。詳しく調べていないがBUWを起動する際にパッケージが更新されることから、何らかの自動化プロセスが組み込まれているようだ。
ライセンス条項の確認に[Y]キーを押して同意すると、Ubuntuのダウンロードやファイルシステムの展開が行われる。その後Ubuntuのユーザー名とパスワードを入力して、Bashが使用可能になる(※現行バージョンでは図のように乱れてしまう) |
シェルスクリプトでリネームを実行する
それでは今回のシェルスクリプトを紹介しよう。Windowsではバッチファイル@コマンドプロンプトや、PowerShellスクリプト@PowerShellなどが存在するように、bashもショートカットやバッチ処理などを行うシェルスクリプト機能が用意されている。今回は本連載担当編集者からのリクエストで、"フォルダー内のJPEGファイルを3桁の数値を持つファイル名にリネーム"するというもの。本誌では画像ファイルに対して「001.jpg」といった名前を付けているため、このような要望があったのだろう。まずはシェルスクリプトをご覧になってほしい。
#!/bin/bash
Dir=/mnt/c/Users/kaz/Desktop/Work1
FileExt=*.jpg
Number=1
cd $Dir
for OldFile in $FileExt; do
NewFile=$(printf %03d.jpg $Number)
echo Rename $OldFile to $NewFile.
mv $OldFile $NewFile
Number=$((Number+1))
done;
1行目はスクリプトを実行するシェルを指定する。2行目の空行に意味はないが、可読性を高めるため、筆者は昔から空行にしてきた。3行目は今回ターゲットとなるフォルダー(ディレクトリ)を、4行目も対象となるファイルタイプを変数として指定している。5行の「Number」はファイル名を「001.jpg」から始めるためのカウンターとして用意した変数だ。7行目はカレントフォルダーを移動させるため、「cd」コマンドを実行している。
ポイントは9~14行目だ。一見して分かるとおり「for」を使ってファイル名の取得や新しいファイル名の指定などを行っている。forは「for 変数 in 複数値・変数・範囲 do コマンド done」という記述で条件や値が変数と合う場合にコマンドを実行するループ命令だ。ここでは、"*.jpgにマッチするファイル(OldFile)が存在する場合、do~doneを繰り返す"形になる。
その内容だが、10行目で3桁の数字(新しいファイル名)を作り出すためprintfを使用し、「00」を生成。そして変数Numberの値「1」を変数NewFileに与えている。11行目はメッセージを出力する「echo」を使用。そして12行目で「mv」コマンドを使用し、実際のリネーム作業を行ってから、変数Numberの値をインクリメントしている。
実際にシェルスクリプトを実行するには実行権限を与えてやらなければならない。詳しくは「chmod」コマンドについて調べてほしいが、「chmod 755 {スクリプトファイル名}」と実行すれば、ひとまず実行可能になる。前述のシェルスクリプトをご自身のPC環境でファイル化し、ディレクトリ名などを変更してから実行すれば、今回の目的を達成できるはずだ。コマンドラインからシェルスクリプトを多用する場合は、対象となるディレクトリを引数から取得する内容に変更すると、より便利になるので、興味をお持ちになった方は是非試してほしい。
スクリプトファイルに実行権限を与えてから、スクリプトを実行した状態。11行目のメッセージが次々と現れる(※サンプルはViを起動して作成しています。Windowsのエディタで保存する場合は、改行コードをLFで保存してください。) |
阿久津良和(Cactus)