파일을 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
pwd의 모든 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 {} \;