按字符編碼查找文件

按字符編碼查找文件

我有一個長時間運行的 python 腳本,無法對檔案進行 utf-8 解碼。錯誤訊息沒有告訴我它在哪個文件上失敗,只是它無法解碼0x81位置中的位元組194。我知道該文件位於哪個資料夾中,但不知道該子樹中數千個文件中的哪個資料夾。我可以透過哪些選項來查找此文件(以及其他類似文件)? bash 中有一個漂亮的單行語句嗎?

更改腳本以列印它所查看的內容並重新運行它,一次修復一個文件,這幾乎不是一種選擇,因為運行腳本一次需要幾個小時。用 Python 寫一個目錄遍歷器似乎工作量太大了。

答案1

isutf8從包中使用moreutils

find . -name '*.py' -exec isutf8 {} +

或者:

find . -name '*.py' | xargs isutf8

(後者假設檔名沒有換行符。)

答案2

要建立類似的失敗文件,我們可以使用以下腳本:

{ printf '%*s' "179"; printf '\x81'; printf '%*s' "20"; } >infile

然後這個指令將會列印文件失敗的位置:

$ isutf8 infile 
infile: line 1, char 1, byte offset 180: invalid UTF-8 code

因此,這將測試.pypwd 中的所有 python () 檔案在位置 180 處是否存在無效代碼:

$ isutf8 ./*.py | grep "offset 180"

或更靈活,一系列偏移量(gnu 擴展正規表示式):

$ isutf8 ./*.py | grep -E "offset (17|18)"

或者,對整個目錄內的檔案進行特定測試:

$ find . -iname "*.py" -type f -exec bash -c 'isutf8 "$1" | grep -E "offset (17|18)"' Find {} \;

相關內容