ユーザ用ツール

サイト用ツール


linux:filesystem

filesystem

tips

日本語ファイル名が長すぎて処理に失敗する

UnavailableVideoError: [Errno 36] File name too long: '/home/matoken/Videos/\xe7\x95\xb0\xe7\xa8\xae\xe6\x97\x8f\xe3\x83\xac\xe3\x83\x93\xe3\x83\xa5\xe3\x82\xa2\xe3\x83\xbc\xe3\x82\xba\xe3\x80\x80\xe7\xac\xac1\xe8\xa9\xb1\xe3\x80\x80\xe3\x82\xa8\xe3\x83\xab\xe3\x83\x95\xe3\x81\xae\xe7\x86\x9f\xe5\xa5\xb3\xe3\x81\xa8\xe4\xba\xba\xe9\x96\x93\xe3\x81\xae\xe7\x86\x9f\xe5\xa5\xb3\xe3\x81\xab\xe3\x81\xa4\xe3\x81\x84\xe3\x81\xa6\xe3\x81\xae\xe8\xad\xb0\xe8\xab\x96\xe3\x81\x8c\xe6\xb2\xb8\xe9\xa8\xb0\xe3\x81\x97\xe3\x80\x81\xe5\xa4\xa9\xe4\xbd\xbf\xe3\x81\xaf\xe3\x83\x8b\xe3\x83\xa3\xe3\x83\xb3\xe3\x83\x8b\xe3\x83\xa3\xe3\x83\xb3\xe5\xa4\xa9\xe5\x9b\xbd\xe3\x81\xa7\xe6\x98\x87\xe5\xa4\xa9\xe3\x81\x97\xe3\x80\x81\xe6\x9c\x89\xe7\xbf\xbc\xe4\xba\xba\xe3\x81\xaf\xe7\xb7\x8f\xe6\x8e\x92\xe6\xb3\x84\xe5\xad\x94\xe3\x81\xa7\xe6\x84\x9f\xe5\xba\xa6\xe3\x82\x82\xe6\x8a\x9c\xe7\xbe\xa4\xef\xbc\x81.fdash-b4723d03-31f0-456c-9a49-70aa8ce6134c-1.m4a.ytdl'

ファイルシステムは ext4。 ファイル名長はバイト単位なので、asciiだと255文字まで。

$ getconf NAME_MAX .
255
$ while [ true ]; do     if ! touch $(printf "%${num}s"  | tr ' ' 'a');    then        echo $num;        break;    fi;    ((num++)); done
touch: cannot touch 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa': File name too long
256

UTF-8の日本語などは1文字当たりのバイト数が多くなる(1〜4byte)ので文字数は短くなる

は1文字当たり3byte

$ echo -n 'a' | wc -c
1
$ echo -n 'あ' | wc -c
3

だと85文字まで

$ num=1;str="あ";while :; do if ! touch $str;    then        echo $num;        break;    fi;    ((num++)); str="$strあ"; done
touch: cannot touch ''$'\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202': File name too long
86

今回の処理はほんの少し足りない程度なので惜しい……。そういえばNTFSやexFATはUnicodeで文字数を数えていた気がするので試してみる。

まずは一時的なexFAT領域を作る

$ dd if=/dev/zero of=./700M.img bs=1M count=700
$ fdisk ./700M.img
$ kpartx -av ./700M.img
$ sudo mkfs.exfat /dev/mapper/loop0p1
$ sudo mount /dev/mapper/loop0p1 /mnt

exfat領域で確認

NAME_MAXはext4と同じ255だけど、

$ getconf NAME_MAX /mnt
255

ext4環境では85文字までしか使えなかった1文字当たり3byteの を255文字使ったファイルが作成できる。

$ num=1;str="あ";while :; do if ! touch $str;    then        echo $num;        break;    fi;    ((num++)); str="$strあ"; done
touch: cannot touch ''$'\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202\343\201\202': File name too long
256

しかし、4byte文字の「😺」だと127文字になる??

$ echo -n '😺' | wc -c
4
$ num=1;str="😺";while :; do if ! touch $str;    then        echo $num;        break;    fi;    ((num++)); str="$str😺"; done
touch: cannot touch ''$'\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272\360\237\230\272': File name too long
128

利用したexFAT driverはexfat-fuse

$ ps ax|grep -i exfat
 1729 ?        Ss     0:12 /sbin/mount.exfat /dev/mapper/loop0p1 /mnt -o rw
$ dpkg-query -W exfat-fuse
exfat-fuse      1.3.0-1
$ /sbin/mount.exfat-fuse -V
FUSE exfat 1.3.0
Copyright (C) 2010-2018  Andrew Nayenko

とりあえず今回はこれで回避した。

Btrfsのbtrfs\-transactionでioが100%になって困る

Btrfsでdfで空き容量があるように見えるのに容量が無いと言われてreadonlyにされてしまう

Btrfsでswap fileが作れないことを知らずに嵌まる

コメント

コメントを入力. Wiki文法が有効です:
53 -9 = 
 
linux/filesystem.txt · 最終更新: 2020/01/19 03:05 by matoken