最近在使用Python 的wget包下載文件時遭遇了OSError: filename too long的異常,經檢查下載的文件名確實很長,於是去查詢Linux x86_64架構下最長文件名支持是多少。
在這篇文章中提到Linux單目錄名支持最大255個字符,全路徑支持4096,但出問題的文件名稱才九十多個字符。於是寫了一個Python腳本驗證一下:
import os if __name__ == '__main__': addname = '我' basename = '' while True: basename += addname try: with open(basename, 'w') as f: os.remove(basename) except Exception as e: print('length %d failed' % len(basename)) break
輸出為86,並不是256。而考慮到大多數漢字的utf-8編碼一般占3字節,顯然Linux對目錄名長度255的限制是字節數而不是字符數。出問題的文件名因為含有大量中日文,其用bytes(str, encode='utf-8')轉換為字節格式后長度已經超過255,嘗試將文件名刪減到255字節以下后成功保存。
結論:x86_64 Linux下文件名最長為255個字節,具體是多少個字符要看字符的utf-8編碼,一般英文會比較長,中文和特殊符號等等比較短。