LoginSignup
0
1

WSL2上でlsしても全てのファイルが表示されない問題  (ls: reading directory '.': Input/output error)

Last updated at Posted at 2023-11-13

問題

前提

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1