問題
前提
Windows10に外付けしたNTFSフォーマットのドライブ。
BitLockerで暗号化済み。
D:\temp_filesは一時的なファイルを保管するディレクトリ。
Windows上では正常に認識されており、ファイル数・フォルダ数、合わせて1000以上あること確認済み。
ドライブの破損かと考えWindows上でchkdsk /fしても問題無い。
状況
WSL内で実行
PS C:\Users/user> wsl
root@win10:/mnt/c/Users/user# cd /mnt/d/temp_files
root@win10:/mnt/d/temp_files# ls -1 | wc -l
ls: reading directory '.': Input/output error
25
ダメです。
WSL外で実行
PS D:\temp_files> wsl ls -1 | wsl wc -l
ls: reading directory '.': Input/output error
24
これもダメです。
wsl --version
WSL バージョン: 1.2.5.0
カーネル バージョン: 5.15.90.1
WSLg バージョン: 1.0.51
MSRDC バージョン: 1.2.3770
Direct3D バージョン: 1.608.2-61064218
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.19045.3324
Dockerコンテナ内からも同様
/temp_data/temp_files # ls -1 | wc -l
25
ダメですね
原因
DrvFs上で扱えるファイル名, ディレクトリ名の最長は255 byteまで。
Linuxを含むUnix系共通の問題でした。
解決法
ファイル名を255 byte, 一般的な日本語(3 byte)のみだと85文字以下に抑える。
絵文字や難読漢字(4 byte)も含めるなら、63文字以下に抑える。
疑似コード
shrink_file_name.exe /d/temp_files/*.* -byte 255
# or
shrink_file_name.exe /d/temp_files/*.* -str 63
結果
全てのファイルの文字数を63文字以下に変更しました。
結果は
PS D:\temp_files> wsl ls -1 | wsl wc -l
1224
Take Home Message
WSLを使う際は、Linux、Windowsの差異を認識し、ファイル名・パスの最大長に注意を払いましょう。
参考
ファイル名の最大長の限界を、ストレージのフォーマットタイプごとに調べる
https://takuya-1st.hatenablog.jp/entry/2021/08/31/103744