문자 인코딩으로 파일 찾기

문자 인코딩으로 파일 찾기

파일을 utf-8로 디코딩하지 못한 장기 실행 Python 스크립트가 있습니다. 오류 메시지는 어떤 파일에서 실패했는지 알려주지 않으며, 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

따라서 이는 .py위치 180에 잘못된 코드가 있는지 pwd의 모든 Python( ) 파일을 테스트합니다.

$ 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 {} \;

관련 정보