ARM版QNAP NASでNFDになっているファイル名をNFCに直す

4 min read読了の目安(約3900字

ファイル名がNFDになっているとは?

参考:Mac OS X の NFD 問題での対策諸々

昔のmacOSで使われていたHFS+というファイルシステムでは、ファイル名に濁点・半濁点やアクセント記号などが含まれていた場合、NFDと呼ばれる文字と修飾をバラバラにする正規化手法っぽい形式になってしまい、WindowsやLinuxなどとファイルを共有する際にファイルパスに関する色々な問題が起こるということが知られていました。

最近のmacOSではファイルシステムがAPFSに一新され、WindowsやLinuxなどで使われているNFCという形式に正規化されるようになったので、このような問題は起こらなくなりました。

概要

この記事では、昔のmacOSでファイルを操作したせいでNAS上にNFDもどきのファイル名が残っている場合に、ARM版QNAP NAS上でconvmvというプログラムを使うことでファイル名の問題を一括で解決する方法について書きます。

QNAP公式の推奨する方法とその問題点

参考:SMB から macOS の Finder を使用しながら、共有フォルダーのファイルにアクセスしようとすると、エラーコード -43 が表示されることがあります。何が原因ですか?
QNAP公式でconvmvを使用して前述した問題を解決する記事が提供されています。
この記事は概ね正しいのですが、ARM版QNAP NASを利用している場合は大きな問題があります。
それは、ARM版QNAPではApp CenterでPerlが提供されていないという問題です。
そこで、本記事では組み込み向けソフトウェアリポジトリであるEntwareを利用してARM版Perlをインストールし、convmvを実行する方法について解説します。

convmvを実行する

Entwareを導入する

Entwareの概要については、EntwareのWikiを参照してください。
このWiki上にQNAP NASへのインストール方法が書かれたページがあります。
このページのthis package for standard installationをクリックすると、App CenterからEntwareを導入するためのEntware_*std.qpkgがダウンロードできます。
このqpkgファイルをApp Centerから手動インストールすると、Perlを導入するためのopkgコマンドをインストールできます。
手動インストールの画面

SSHでコンソールにアクセスする

convmvを実行するにはコンソールアクセスが必要なので、SSHを有効にします。
SSHアクセスを有効にする
設定したらNASのIPアドレスを調べて、ローカルマシンのターミナルからsshコマンドなどでコンソールに接続します。
ユーザー名は大体の場合はadminで、パスワードはWeb GUIにadminでログインするときに使うものを入力します。
ログインすると以下のような管理画面が表示されますが、通常のコンソールにアクセスしたいので、Qを押して管理画面を終了します。
ログイン時の画面

Perlをインストールする

コンソールからopkgコマンドを使用してPerlをインストールします。
perlだけではconvmvが依存しているなPerlに同梱されている標準ライブラリがインストールされないので、perlbase-*のパッケージをいくつかインストールする必要があります。
これらのパッケージが依存しているperlbase-*のパッケージもインストールされるので、結果的に指定しているよりもたくさんのパッケージがインストールされます。
以下のコマンドで依存パッケージをインストールします。

opkg install perl perlbase-getopt perlbase-file \
  perlbase-encode perlbase-storable perlbase-unicode

convmvを実行する

参考:SMB から macOS の Finder を使用しながら、共有フォルダーのファイルにアクセスしようとすると、エラーコード -43 が表示されることがあります。何が原因ですか?

https://www.j3e.de/linux/convmv/ からconvmvの最新版をダウンロードします。
展開してconvmvファイルの先頭行のShebangを#!/usr/bin/perl#!/opt/bin/perlに変更します。
何らかの方法でNASに実行ファイルを転送し、SSHコンソール上でchmod a+x convmvを実行し、実行権限を付与します。
以下のコマンドを実行し、どのようなファイル名の変換が行われるか確認します。(このコマンドを実行する段階ではファイル名の変更は行われません)

./convmv -r --nfc --nosmart -f UTF-8 -t UTF-8 /share/<フォルダ名>

以下のコマンドを実行し、ファイル名の変換を実際に実行します。

./convmv -r --nfc --nosmart -f UTF-8 -t UTF-8 --notest /share/<フォルダ名>

これで完了です。