Linux

如何判斷 Linux 上文件名的語言編碼?

  • June 18, 2021

我有一個目錄,其中包含來自外部源的約 10,000 個圖像文件。

許多文件名包含對 DB 或 Web 不友好的空格和標點符號。我還想在每個文件名的末尾附加一個 SKU 編號(出於會計目的)。許多(如果不是大多數)文件名還包含擴展拉丁字元**,我想保留這些**字元以用於 SEO 目的(特別是文件名准確地代表 Google 圖片中的文件內容)

我製作了一個 bash 腳本,它將所有文件重命名(複製)為我想要的結果。bash 腳本以 UTF-8 格式保存。執行後它省略了大約 500 個文件(無法統計文件…)。

我在目錄上執行了 convmv -f UTF-8 -t UTF-8,發現這 500 個文件名沒有以 UTF-8 編碼(convmv 能夠檢測並忽略已經在 UTF-8 中的文件名)

有沒有一種簡單的方法可以找出他們目前使用的語言編碼**?**

我能夠弄清楚自己的唯一方法是將我的終端編碼設置為 UTF-8,然後使用 convmv 遍歷所有可能的候選編碼,直到它顯示一個“看起來正確”的轉換名稱。我無法確定這 500 個文件都使用相同的編碼,所以我需要重複這個過程 500 次。我想要一種比“看起來不錯”更自動化的方法!!!

真的沒有 100% 準確的方法,但有一種方法可以給出一個很好的猜測。

這裡有一個 python 庫 chardet:https ://pypi.python.org/pypi/chardet

例如

查看目前 LANG 變數設置為:

$ echo $LANG
en_IE.UTF-8

創建一個需要使用 UTF-8 編碼的文件名

$ touch mÉ.txt

改變我們的編碼,看看當我們嘗試列出它時會發生什麼

$ ls m*
mÉ.txt
$ export LANG=C
$ ls m*
m??.txt

好的,現在我們有了一個以 UTF-8 編碼的文件名,我們目前的語言環境是 C(標準 Unix 程式碼頁)。

所以啟動 python,導入 chardet 並讓它讀取文件名。我正在使用一些shell globbing(即通過* 萬用字元進行擴展)來獲取我的文件。將“ls m*”更改為與您的範例文件之一匹配的任何內容。

>>> import chardet
>>> import os
>>> chardet.detect(os.popen("ls m*").read())
{'confidence': 0.505, 'encoding': 'utf-8'}

如您所見,這只是一個猜測。“可信度”變數顯示了猜測的好壞。

引用自:https://serverfault.com/questions/82821