리눅스에서 파일 이름의 언어 인코딩을 말하는 방법?


17

외부 소스에서 ~ 10,000 개의 이미지 파일이있는 디렉토리가 있습니다.

많은 파일 이름 에는 DB 친화적이거나 웹 친화적이지 않은 공백과 문장 부호가 포함되어 있습니다. 또한 모든 파일 이름 끝에 SKU 번호를 추가하고 싶습니다 (회계 목적으로). 대부분의 파일 이름은 아니지만 대부분은 SEO 목적으로 유지하려는 확장 라틴 문자 포함 합니다 (특히 파일 이름은 Google 이미지의 파일 내용을 정확하게 나타냅니다)

모든 파일의 이름을 원하는 결과로 바꾸는 bash 스크립트를 만들었습니다. bash 스크립트는 UTF-8로 저장됩니다. 실행 후 약 500 개의 파일이 생략됩니다 (stat 파일을 스태킹 할 수 없음 ...).

내가 실행 한 convmv -f UTF-8 -t UTF-8 디렉토리에,이 500 파일 이름이됩니다의 발견 된 하지 UTF-8로 인코딩 (convmv 감지하고 UTF-8에서 파일 이름이 이미 무시할 수있다)

내가 찾을 수있는 쉬운 방법이 있는 가 현재 사용하고있는 언어 인코딩은?

내가 알아낼 수있는 유일한 방법은 터미널 인코딩을 UTF-8로 설정 한 다음 변환 된 이름이 '올바로 보이는'이름을 표시 할 때까지 convmv를 사용하여 가능한 모든 후보 인코딩을 반복하는 것입니다. 이 500 개의 파일이 모두 동일한 인코딩을 사용하는지 확신 할 수있는 방법이 없으므로이 프로세스를 500 번 반복해야합니다. 나는 '올바른 모습'보다 더 자동화 된 방법을 원합니다 !!!

답변:


13

실제로 100 % 정확한 방법은 없지만 좋은 추측을 할 수있는 방법이 있습니다.

파이썬 라이브러리 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 코드 페이지)입니다.

파이썬을 시작하고 chardet을 가져 와서 파일 이름을 읽도록하십시오. 파일을 가져 오기 위해 쉘 글 로빙 (예 : * 와일드 카드 문자를 통한 확장)을 사용하고 있습니다. "ls m *"를 예제 파일 중 하나와 일치하는 것으로 변경하십시오.

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

보다시피, 추측 일뿐입니다. "confidence"변수는 추측이 얼마나 좋은지를 보여줍니다.


스크립트는 설명대로 작동하지만 제 경우에는 chardet이 파일의 인코딩을 찾지 못했습니다.
Fedir RYKHTIK

6

현재 작업 디렉토리 (python 2.7)를 테스트하는 데 유용 할 수 있습니다.

import chardet
import os  

for n in os.listdir('.'):
    print '%s => %s (%s)' % (n, chardet.detect(n)['encoding'], chardet.detect(n)['confidence'])

결과는 다음과 같습니다.

Vorlagen => ascii (1.0)
examples.desktop => ascii (1.0)
Öffentlich => ISO-8859-2 (0.755682154041)
Videos => ascii (1.0)
.bash_history => ascii (1.0)
Arbeitsfläche => EUC-KR (0.99)

현재 디렉토리에서 트로프 경로를 되풀이하려면 이것을 작은 파이썬 스크립트로 잘라 붙여 넣습니다.

#!/usr/bin/python

import chardet
import os

for root, dirs, names in os.walk('.'):
    print root
    for n in names:
        print '%s => %s (%s)' % (n, chardet.detect(n)['encoding'], chardet.detect(n)['confidence'])

아시아 인코딩에서도 작동합니까? 아니면 유로 중심인가?
17:29에
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.