Windows 10 Anniversary UpdateからサポートしたWSL(Windows Subsystem for Linux)。その結果としてWindows 10上でもBUW(Bash on Ubuntu on Windows)が動作し、各種Linuxコマンドが利用可能になった。本連載ではWSLに関する情報や、Bashから実行するシェルスクリプトを紹介する。

当日使ったファイルをアプリで開き直す

前回のシェルスクリプトでは、「find」コマンドの「mtime」オプションを利用し、当日使ったファイルを列挙した。だが、再びそれらのファイルを編集する場合、結局はWindowsのアプリケーションを利用しなければならない。現在のBUWはbash内からデスクトップアプリなどを起動できるものの、Windows 10の関連付けを利用することはできない(はずである)。

bash内でテキストファイルを実行するとエラーになる。実行ビットを付与しても結果は同じだ

本稿はWindows 10 Insider Preview ビルド15063で検証した結果を基に執筆しているため、Windows 10 Creators Updateと呼ばれる次期大型アップデートでも結果は一緒と思われるが、どうせならばWindows 10の関連付けをBUW内に持ち込めると便利ではないだろうか。この辺りはタイミングを見てフィードバックHubでリクエストしたいと考えているが、問題はシェルスクリプトである。

対象となるファイルをアプリケーションで起動するには、あらかじめシェルスクリプト内で利用する実行ファイル名の定義が必要だ。さらに検索条件にマッチしたファイルを個別の実行ファイルで起動するのは少々煩雑である。当初は「xargs」コマンドで1度整理してから独自関数を用いる方法を試してみたが、最終的にはfindコマンドの結果をパイプで「while」文に渡して、「case」文で処理を分岐させる方法を選択した。

試行錯誤の結果完成したのが以下のシェルスクリプトである。いつもどおり任意のテキストエディターに以下の内容を入力し、必要に応じて出力先のパスなどを変更してから、「chmod」コマンドなどで実行権限を与えて動作を確認してほしい。

 #!/bin/bash

IFS_BACKUP=$IFS
IFS=$'\n'
CMDNAME=`basename $0`
NOTEPAD='notepad.exe'
WINWORD="/mnt/c/Program Files/Microsoft Office/root/Office16/WINWORD.EXE"
EXCEL="/mnt/c/Program Files/Microsoft Office/root/Office16/EXCEL.EXE"

function usage() {
    echo "Usage: $CMDNAME [対象ディレクトリ]"
    echo ""
    exit 1
}

if [ $# -ne 0 ] && [ -d $1 ]; then
    find $1 -mtime -1 -type f \( -name '*.txt' -or -name '*.docx' -or -name '*.xlsx' \) \
        | while read F; do
            case "$F" in
                *txt ) $NOTEPAD $F & ;;
                *docx ) $WINWORD $F & ;;
                *xlsx ) $EXCEL $F & ;;
            esac
        done
else
    usage
fi

IFS=$IFS_BACKUP

本シェルスクリプトに存在するフォルダーを引数として与えると、指定した種類(テキスト文書、Word文書及びExcelワークシート)のファイルを検索し、その結果に応じて該当するアプリケーションが起動し、ファイルを開く。

シェルスクリプトを実行すると、シェルスクリプト内で定義したアプリケーションが起動し、当日編集したファイルのみ開く

それでは今回の変更点をご紹介しよう。3~4及び29行目は区切り文字を定義している環境変数「IFS」を1度改行のみとし、29行目で元の状態に戻している。これは実行ファイルのパス名に空白を含んでいると正しく動作しない場合の処理だ。また、6~8行目は順番に「メモ帳」「Microsoft Word」「Microsoft Excel」のパスを含めた実行ファイル名を各変数で定義している。

17行目のfindコマンドは前回と変わらないものの、18~24行目を新たに追加した。findコマンドの検索結果を「read」コマンドで変数「F」に代入し、その内容でwhileを回している。ループ内はcaseで変数Fに格納された文字列の末尾に応じて分岐させ、6~8行目で定義したアプリケーションを実行する仕組みだ。ちなみに「&」は各アプリケーションをバックグラウンドジョブとして起動するために必要だ。1度にアプリケーションを起動させたくない場合は取り除いてもよい。

本シェルスクリプトでは、使用頻度が高いと思われる3種類のファイルタイプを指定しているが、お使いのアプリケーションに応じて拡張子と実行するアプリケーションのパスを含む実行ファイル名を追加すれば、容易に拡張できるので是非試してほしい。

阿久津良和(Cactus)