파일 이름을 다른 인코딩으로 바꾸는 방법은 무엇입니까?


8

마운트 된 하드 드라이브에는 CP1251, KOI-8, UTF-8 및 ASCII의 3 가지 유형의 file name인코딩이 reiserfs있습니다. 모든 인코딩을 재귀 적으로 UTF-8로 변환해야합니다. 소스 인코딩을 감지하여 UTF-8로 변환하는 유틸리티가 있습니까? 아니면 Python 스크립트를 작성해야합니까?


일반적인 경우 이름 인코딩을 자동으로 "추측"할 수 없습니다 (예를 들어, 대부분의 바이트 시퀀스는 유효한 KOI-8 및 CP1251 (그러나 다른) 파일 이름입니다). 이름 인코딩을 알 수있는 추가 단서가 있습니까?

다른 단서가 없습니다 :(
Pablo

소문자 파일 이름과 대문자 파일 이름이 모두 있습니까?

예, 대문자와 소문자 모두 이름이 있습니다.
Pablo

필요한 사람? 확인하십시오 detox. 그것은 사용하여 ISO-8859-1 및 UTF-8 사이에 나를 위해 일한-s iso8859_1-only
의 Alwin 케슬러에게

답변:


12

서로 다른 인코딩간에 파일 이름을 변환하는 CLI 도구 인 convmv를 사용하십시오. -f이러한 enconding을 ( -t) UTF-8 로 ( ) 로 변환하려면 다음을 수행하십시오.

convmv -f CP1251 -t UTF-8 inputfile
convmv -f KOI-8  -t UTF-8 inputfile
convmv -f ASCII  -t UTF-8 inputfile

또한 파일 내용을 변환하려면 iconvCLI 도구 인을 사용하여 파일 내용을 다른 인코딩으로 변환하십시오. -f이러한 enconding을 ( -t) UTF-8 로 ( ) 로 변환하려면 다음을 수행하십시오.

iconv -f CP1251 -t UTF-8 inputfile > outputfile
iconv -f KOI-8  -t UTF-8 inputfile > outputfile
iconv -f ASCII  -t UTF-8 inputfile > outputfile

1
내가 변환해야하는 파일 내용은 아니지만 파일 이름 자체
Pablo

괜찮아. convmv를 사용해 보셨습니까?
Marcos Roriz Junior

ASCII는 이미 UTF-8의 하위 집합이므로 변환 할 필요가 없습니다.
psusi

1

아니. 구식 코드 페이지 시스템의 큰 단점 중 하나는 어떤 코드가 사용되고 있는지 감지 할 수있는 방법이 없다는 것입니다. 당신은 단순히 선험을 알고 있어야합니다. 어떤 파일이 어떤 인코딩을 사용하고 있는지 알고 있다면 다음과 같은 방법으로 이름을 변환 할 수 있습니다.

mv somefile `echo somefile | iconv -f CP1251 -t UTF-8`

수동으로 이름을 바꿀 파일이 너무 많습니다 ... 코드 페이지에 고유 한 문자 코드 범위가 있다고 생각했습니다.
Pablo

@Pablo, 아니오, 그것은 요점입니다. 8 비트 바이트에는 256 개의 가능한 문자 코드 만 있습니다. 추가 코드를 위해 128 개의 왼쪽 문자를 남겨 두는 일반적인 ASCII 문자 및 제어 코드 세트를 빼면 모든 언어의 전체 문자 범위를 나타내기에 충분하지 않습니다. 각 코드 페이지는 사용자에게 중요한 문자를 나타내는 상위 128 개의 코드를 자체적으로 사용합니다. 사용중인 코드를 파악하는 유일한 방법은 가능한 각 코드 페이지를 표시하고 이름이 의미가 있고 컴퓨터와 다른 것이 아닌지 확인하는 것입니다.
psusi

글쎄, 파이썬 chardet은 어떻게 든 그것을 감지하고 있습니다 ...
Pablo

@Pablo, neat ... 글씨가 다른 문자의 유병률을 기반으로 교육 된 추측을하는 것처럼 보입니다. 다시 말해, 구피 글리프와 같은 특정 문자가 악센트 부호가있는 'a'보다 덜 인기 있다고 가정하고 각 코드 페이지의 문자를 해석하려고 시도하여 더 인기있는 문자와 일치하는 코드가 가장 많은 문자를 찾습니다. 특히 파일 이름과 같은 소수의 문자에 대해서는 정확하지 않을 수 있습니다.
psusi

0

iconv@psusi sugeses 와 동일한 솔루션 이지만 루프 및 while 카드는 다음과 같습니다.

또한 oneline 쉘 sh스크립트 :

for f in /path/*.txt; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done

파이프 라인에서 while 카드를 읽는 경우 :

echo * | for f in `read f&&echo $f`; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.