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


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.