【連載】

Windows 10で始めるBash

42 1週間のファイルをISOファイルに書き込むシェルスクリプト

42/43

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

最新のWSLはシリアルデバイスをサポート

既に多く方がWindows 10 バージョン1703(Creators Update)に更新されたと思うが、Windows 10 Insider Preview上のBUWは、着々と進化を遂げている。ビルド16170では、マルチキャストグループに参加するIP_ADD_MEMBERSHIP及びIPV6_ADD_MEMBERSHIPをソケットオプションでサポート。ビルド16176では、/mnt/cなどWSLからNTFSへアクセスする際に用いるdrvfsで、UNCやCDFS、FAT、リモートドライブなどをサポートしている。

「ls /dev/ttyS*」の実行結果

さらに同ビルドはシリアルデバイス(COMポート)のサポートが行われた。公式ブログによれば、/dev/ttyS[N]をCOM[N+1]にマッピングし、/dev/ttyS0を叩けばCOM1を利用できるという。Microsoftは本機能で実現するシナリオとして、BUWからUSBシリアルドライバーを叩くプログラムの実現や、cuコマンドを使ったRaspberry Pi 2シリアル端末への接続、Hyper-V仮想COMポートなどを経由したデータ転送が可能になると説明した。

WSLとWindows 10 COMポートの関係図(公式ブログより抜粋)

Linuxでシリアル通信を行うシーンはネットワークハブやルーターのメンテナンスを行う際、日常的に行われてきたが、BUW上でも同様の作業が可能になることで、開発者の利便性は大きく高まりそうだ。

1週間のファイルをISOファイルに書き込む

さて、以前の連載で当日に変更を加えたファイルを列挙し、アプローチを行うシェルスクリプトを紹介した。findコマンドを使うことで指定した拡張子を持つファイルのみを抽出するというものだが、その応用編として「1週間前までのファイルをピックアップして、ISOイメージにバックアップ」するシェルスクリプトを作成したい。

LinuxでISOイメージファイルを作成する場合、mkisofsコマンドを使うのが通例だと思っていたが、それは筆者が学んだ1990~2000年代までの常識らしい。最近はフォーク版であるgenisoimageを含むcdrkitを使うようだ。ちなみにcdrkit自体もcdrtoolsのフォーク版にあたる。BUWにはcdrkitは含まれていないものの、今回は光学メディアへ書き込みを行うwodimなどは必要ないため、genisoimageのパッケージのみインストールすることにした。

「sudo apt install genisoimage」を実行して、対象パッケージをインストールする

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

 #!/bin/bash

 IFS_BACKUP=$IFS
 IFS=$'\n'
 CMDNAME=`basename $0`
 DAY=`date +%Y%m%d`
 TMPDIR=/tmp/tmp`date '+%s'`

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

 if [ $# -ne 0 ] && [ -d $1 ]; then
    mkdir $TMPDIR
    find $1 -mtime -7 -type f \( -name '*.txt' -or -name '*.docx' -or -name '*.xlsx' \) \
        | xargs -i cp -v {} $TMPDIR
    genisoimage -r -J -input-charset=utf-8 -V $DAY -o $DAY.iso $TMPDIR
    rm -rf $TMPDIR
 else
    usage
 fi

 IFS=$IFS_BACKUP

本シェルプログラムを実行すると、findコマンドで1週間内に変更を加えたファイル(拡張子「.txt」「.docx」「.xlsx」)をピックアップし、それらを一時フォルダー(ディレクトリ)にコピーしてから、genisoimageコマンドでISOファイルを作成する。

シェルスクリプトを実行した状態。今回は分かりやすくするため、cpコマンドの実行結果を出力させている

カレントフォルダーに出力したISOファイルをWindows 10でマウントした状態

それではシェルスクリプトの内容を解説しよう。まず6行目ではISOファイル名やISOイメージのボリュームラベルに用いる文字列をdateコマンドで取得し、変数DAYに代入している。7行目は作業用フォルダーを作成するため、UNIX時間(エポックタイム)を使用した。具体的には1970-01-01 00:00:00 UTCからの秒数を取得し、「/tmp/tmpXXXXXXXX」というフォルダー名を取得できる。こちらを16行目のmkdirコマンドで作成し、ISOファイル用の作業フォルダーとした。

18行目ではfindコマンドの結果を、標準入力から受け取った内容を引数で指定したコマンドを実行するxargsに渡している。cpコマンドに関する説明は不要と思われるが、今回はコピー結果を示すため、オプション「-v」を追加した。冗長に感じる場合は削除して構わない。

19行目はISOファイルを作成する骨子の部分。オプション「-r」はファイル名の制限を抑えるRock Ridge形式の指定、オプション「-J」はMicrosoftのISO 9660拡張規格であるJoliet形式の指定を行っている。また、オプション「-input-charset」は文字コードを指定しているが、省略した場合はロケールから自動判断するので、場合によっては取り除いて構わない。オプション「-V」はボリュームラベル名、オプション「-o」は出力するISOファイル名を指定し、最後の引数で内容となるフォルダーを指定する。ISOファイル作成後は20行目のrmコマンドで一時フォルダーを削除して処理完了だ。

阿久津良和(Cactus)

<お知らせ>
ITソリューション検討Information

マイナビニュースのIT Search+では、ITソリューションの検討に役立つ情報を掲載しています。
ここでは、IT Search+の人気記事ベスト3をご紹介。ぜひ、ビジネスにお役立てください。

42/43

インデックス

連載目次
第43回 Office 2016の最新バージョン情報を公式サイトから取得する
第42回 1週間のファイルをISOファイルに書き込むシェルスクリプト
第41回 WSL上のLinuxディストリビューションを変更する
第40回 知ってますか今年の祝日? 国民の祝日自動取得シェルスクリプト
第39回 Bashから当日使ったファイルをWindowsのアプリケーションで開く
第38回 Findで当日使ったファイルを検索する
第37回 HTMLコードの出力シェルスクリプトをRowspan属性に対応させる
第36回 HTMLのTableタグ出力シェルスクリプトをColspanに対応させる
第35回 BashでHTMLのTableタグを楽に
第34回 ファイル名の大/小文字一括変更シェルスクリプトをオプションで制御する
第33回 規則に応じたファイル名の大/小文字化
第32回 拡張子を一括で小文字に統一するスクリプト
第31回 Googleカレンダーから情報を抜き出す
第30回 ドライブを占有するフォルダー容量をExcelで可視化する
第29回 ドライブを占有するフォルダー容量を「R」で可視化する
第28回 ドライブを占有するフォルダー容量をSparkで可視化する
第27回 ドライブを占有する容量をフォルダーごとに簡単確認
第26回 オプションを加え汎用性を高めたレジストリーキー比較スクリプト
第25回 Reg.exeの出力結果をカラフルにして見やすくする
第24回 Reg.exeの出力結果を比較する
第23回 getoptsを活用してイベントソース可視化を大幅に拡張する
第22回 BashからPowerShellを利用する
第21回 Windowsのイベントソースを可視化してオプションで表示を分ける
第20回 Windowsのイベントログを「Cut」で切り出し可視化する
第19回 PDFファイルを画像ファイル化する
第18回 PDFファイルから一括で大量の画像を抽出
第17回 複数PDFファイルから一括テキスト抽出
第16回 文章をMarkdown記法で整える
第15回 ファイル名ではなく内容判断で重複ファイルを削除するには?
第14回 整理整頓!空のフォルダを一括でデスクトップに移送する
第13回 フォルダの中のファイルを一括でPDFにするには
第12回 フォルダーの中のエクセル請求書ファイルを合計する
第11回 BashからExcelブックにアクセスする
第10回 時間軸でデスクトップを片付ける
第9回 散らかったデスクトップを片付ける
第8回 インターネットショートカットファイルを作成する
第7回 取得結果をCSVファイルやテキストファイルに出力する
第6回 Webページの情報をシェルスクリプトで取得する
第5回 case文でスクリプト内容を整理する
第4回 実行先のフォルダーを引数で指定する
第3回 ピクセルサイズに応じて画像ファイルをリサイズする
第2回 他の画像形式をJPEG形式に変更する
第1回 フォルダー内のJPEGファイルを連番でリネームする

もっと見る



人気記事

一覧

イチオシ記事

新着記事