バックナンバー

Ubuntu 16.04へ更新する

Windows Insider Programに参加している場合、エンドユーザーレベルでは最新のWindows 10を使用できる。もちろん開発途上のため安定性を欠くこともあるが、その場合はファーストリングではなくスローリングを選択すれば、一定の安定性を維持しながら、CB(Current Branch)よりも新しいOSビルドを使用することも可能だ。

Windows 10 Insider Programではファースト/スローリングが選択できる

本連載の読者諸氏は業務にPCを使う方が多いため、Windows 10 Insider Previewをお薦めするのは気が引けるものの、BUW(Bash on Ubuntu on Windows)を使うのであれば、選択肢の1つに加えるべきである。その理由が、Windows 10と共にWSL(Windows Subsystem for Linux)も更新されるからだ。リリースノートによればOSビルド14936は、現在および子プロセスなどに対してルートディレクトリを変更するchrootシステムコールがサポートされた。また、IPv6ソケットのバインドなど着々と完成度を高めている。

そしてもっとも大きな変更点がUbuntu 16.04 LTSのサポートだ。先のリリースノートでMicrosoftシニアプログラムマネジャーのRuss Alexander氏は、「まもなくリリースが始まる」と説明し、新たにWSLを有効にする環境ではバージョン16.04のイメージが降ってくるという。だが、本稿執筆時点で「ストア」からダウンロードされるのはUbuntu 14.04 LTSだった。Windows 10 Insider Preview使用中で、いち早くUbuntu 16.04 LTSへ更新する場合は、「sudo do-release-upgrade」コマンドを使えば更新可能だ。

新たに有効にしたBUWはUbuntu 14.0.4 LTSだったリポジトリを最新の状態にしてからパッケージを更新し、Ubuntu 14.0.5 LTSへアップデートしなければならない

その後「sudo do-release-upgrade」コマンドを実行すると、Ubuntu 16.04へのアップグレードが始まる

Ubuntu 16.04の更新内容は公式Wikiで確認できるように、カーネルを始めとする各種パッケージが更新されているものの、unameコマンドでカーネルバージョンを確認するとバージョン3.4と示される。仮想マシンにインストールしたUbuntu 16.04 LTSはバージョン4.4であることから、何らかのブロックがかかっていると思われるが、BUWベースで使用する限り、大きな問題とはならないので、このまま様子を見ることにした。

コマンドプロンプトを一度終了させてから再び起動すると、アップグレードが完了し、Ubuntu 16.04への更新が完了する

こちらは仮想マシンにインストールしたUbuntu 16.04 LTS。カーネルバージョンは公式Wikiの説明どおりバージョン4.4がインストールされている

指定先の空フォルダーを一括削除する

さて、Windowsに限った話ではないが、長年PCを使っていると、なぜか空のフォルダーがそのまま残ってしまうことがある。アプリケーションが作成したフォルダーもあれば、自身が必要だと思って作ったものの、そのまま放置してしまうなど理由は多様だ。このような場面で活用するのが「find」コマンドである。指定したフォルダー(ディレクトリ)を再帰的に調査し、諸条件にマッチするファイルやフォルダーを検索するために用意され、Windowsにも移植されているので使用した経験をお持ちの方も少なくないだろう。

findコマンドは、「find {対象フォルダー} {検索条件}」という書式で使用し、独自のパータンやパーミッションを用いた条件判断などを用いてファイルやフォルダーを検索する。また、-execコマンドを併用すれば、検索条件にマッチしたファイルやフォルダーを他のコマンドに"アクション"として渡すことも可能だ。今回は不要な空フォルダーを検索対象にするため、-emptyコマンドと-type dコマンドを追加している。コマンドラインから見れば「find {対象フォルダー} -empty -type d -exec rm -rf {} \;」と実行すればよい。だが、そのまま削除してしまうことに不安を覚える方もおられるだろう。このような条件で作成したのが、下記に示したシェルスクリプトである。シェルスクリプトを作成したら、実行権限を与えてからお試し頂きたい。

 #!/bin/bash

 Cmdname="$0"
 MoveDir="/mnt/c/Users/kaz/Desktop/_Delete"

 if [ "$#" -ne 1 ]; then
    echo "Usage: ${Cmdname} Directory" 1>&2
    exit 1
 elif [ -d $1 ]; then
    if [ ! -d $MoveDir ]; then
        mkdir $MoveDir
    fi
    find $1/ -empty -type d -exec mv -n {} -t $MoveDir \;
 fi

これまでの連載をご覧になってきた方なら、ひと目で分かるとおり、ポイントは13行目である。シェルスクリプト実行時に受け取った引数を9行目で判別し、10~12行目は変数MoveDirで指定したフォルダーが存在するか確認。存在しない場合は11行目のmkdirコマンドで作成する。そして13行目は引数をfindコマンドに渡し、-execコマンドでは、mvコマンドで検索対象となったフォルダーを変数MoveDirで指定したフォルダーに移動する仕組みだ。

実行前の対象フォルダー。分かりやすいように0バイトのテキストファイルも用意した

シェルスクリプトを実行すると、デスクトップに作成した「_Delete」フォルダーへ空のフォルダーのみ移動する

後はフォルダー名などを確認し、本当に不要か判断してから削除すればよい。もっともfindコマンドは1行目で複数の処理を行う"ワンライナー"として使う場面が多いため、わざわざシェルスクリプトを記述する必要はない。今回は移動先となるフォルダーを作成する関係からシェルスクリプトの形を取ったが、日常的には「find {対象フォルダー} -empty -type d -exec {アクション} \;」というワンライナーを身に付けておくことをお薦めする。

阿久津良和(Cactus)