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

当日使ったファイルを検索する

PCを日常業務に利用している場合、午前中に作成し終えたファイルを午後に参照するといった場面は少なくない。Windows 10のエクスプローラーであれば、<検索>タブから<更新日>を指定することで当日更新したファイルを絞り込み検索できる。さらに<検索内容を保存>ボタンから検索条件をsearch-msファイルとして保存すれば再利用も容易だ。

エクスプローラーの検索機能。検索対象をドキュメントに絞り込む場合は「分類:=ドキュメント 更新日時:今日」と指定すればよい

しかし、本機能が便利なのはドキュメントなど利用したフォルダーが分かっている場合に限られる。例えばCドライブのルートフォルダーを検索先として指定すれば、各所に散らばるファイルを順次探し出せるものの、パフォーマンス的な問題が発生するからだ。また、コマンドライン操作がお好みの読者諸氏であれば、わずらわしいGUI操作は極力避けたいのではないだろうか。

そこで利用したいのが、階層的にファイルやフォルダー(ディレクトリ)を検索する「find」コマンドだ。コマンドプロンプトにも同名のコマンドが存在するが、こちらはLinuxにおける「grep」コマンドに相当し、内容は大きく異なる。findは更新日時や種類、ファイル/フォルダー名などを用いて検索し、任意のコマンドとして渡すことが可能だが、実際の業務はWordやExcelなどのデスクトップアプリを利用するため、BUW上ではファイルの存在さえ分かれば充分だろう。

そこでfindの「-exec」オプションとして「file」コマンドを選択してみた。こちらは引数として指定したファイルの先頭数バイトを読み込んでファイル形式を判断する。ベースとなる1973年の時点では100種類前後のファイルしか判別できなかったものの、オープンソース版では千数百種に対応済み。なお、これらのデータベースは「/usr/share/file/magic」で管理されている。

/etcの内容に対してfileを実行した状態。ディレクトリやテキストファイルの文字コードなどが確認できる

話を本題に戻そう。findは対象となるディレクトリを最初に指定するなど、他のコマンドと比べて引数の扱い方が異なるため、諸条件はあらかじめシェルスクリプトに書き込んでおいた方が簡単だ。今回は当日作成した特定のアプリケーションファイルを探し出すことを目的にシェルスクリプトを作成している。いつもどおり任意のテキストエディターに以下の内容を入力し、必要に応じて出力先のパスなどを変更してから、「chmod」コマンドなどで実行権限を与えて動作を確認してほしい。

 #!/bin/bash

 CMDNAME=`basename $0`

 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' \) -exec file {} \; 2>/dev/null
 else
    usage
 fi

本シェルスクリプトに存在するフォルダーを引数として与えると、指定した種類(テキスト文書、Word文書およびExcelワークシート)のファイルを検索し、その結果をfileに渡している。ご覧のとおり対象外のファイルは取り除かれる仕組みだ。

画像ファイルなども用意している

こちらがシェルスクリプトの実行結果。findコマンドで検索した内容をtestコマンドに渡して、内容を表示させた

今回のシェルスクリプトは事実上のワンライナースクリプトだが、11行目のif文でエラーチェックを行っている。引数の数を格納する変数「$#」が「0」以外であると同時にオプション「-d」を使って、引数として渡されたフォルダーが存在するか確認する仕組みだ。これらの条件を満たすと12行目のfindコマンドを実行するのだが、今回は当日使ったファイルがターゲットとなるため、最終更新日時を指定する「-mtime」オプションを用いている。「-1」と指定することで単純に24時間前までが範囲となるが、12時間前までであれば「-0.5」に変更してほしい。

続く「-type」はファイルの種別を指定するオプションだが、「f」の場合はファイルが対象となる。そして「-name」は検索時のファイル名に条件を付けるというもの。今回は複数条件にするためオプション「-or(-o)」を使用した。この辺りは業務内容やご自身の作業スタイルに応じて変更すると使いやすくなるだろう。なお、末尾の「2>/dev/null」はユーザー権限ではアクセスできない旨を示すエラーメッセージを抑止するために加えている。