NAS(DS1815+)にLinuxからCIFSマウントしてrsyncでコピーした日本語ファイルが、SMBでWindowsクライアントからはアクセスできるが、Macから(SMBでもAFPでも)アクセスできない(見えない)という現象が発生しました。これはファイル名のユニコード正規化の差によるものです(誰が悪いわけでもなく、ファイルシステムのポリシーの違いによるもの)。
Windowsで外付けディスクやUSBメモリーにコピーしてMacでマウントしてコピーし直す、という対処法もありますが、ファイルの数が多いと時間がかかりますし、普通にGUIでコピーするとファイルのタイムスタンプも変わります。
これはNASにパッケージセンターからPython3をインストールし(今更Python2でもないので)、SSHでログインして次の簡単なスクリプトを実行することで解決できます。
#!/usr/local/bin/python3
import sys
import os
import unicodedata
def patchAll(root,execute):
for base,dirs,files in os.walk(root,topdown=False):
for f in dirs:
n = unicodedata.normalize("NFC",f)
if n != f:
if execute:
os.rename(os.path.join(base,f),os.path.join(base,n));
print('dir in "{base}": "{f}" -> "{n}"'.format(base,f,n))
for f in files:
n = unicodedata.normalize("NFC",f)
if n != f:
if execute:
os.rename(os.path.join(base,f),os.path.join(base,n));
print('file in "{base}": "{f}" -> "{n}"'.format(base,f,n))
base = None
execute = False
for p in sys.argv[1:]:
if p[0] == '-':
if 'e' in p:
execute = True
else:
base = p
if base:
patchAll(base,execute)
これを、/volume1/homes/admin/normalize.pyとし、/volume1/public/以下のファイルを修正したいとすると、
python3 /volume1/homes/admin/normalize.py /volume1/public
で変更されるファイルが確認できます。
python3 /volume1/homes/admin/normalize.py -e /volume1/public
で実際に変更を行います。