스크립트를 통해 유닉스에서 파일 인코딩을 찾는 방법
문제
디렉토리에 배치 된 모든 파일의 인코딩을 찾아야합니다. 사용 된 인코딩을 찾는 방법이 있습니까?
그만큼 file
명령은 이것을 할 수 없습니다.
나에게 관심이있는 인코딩은 ISO-8859-1입니다. 인코딩이 다른 것이라면 파일을 다른 디렉토리로 이동하고 싶습니다.
다른 팁
file -bi <file name>
많은 파일을 위해 이것을하고 싶다면
for f in `find | egrep -v Eliminate`; do echo "$f" ' -- ' `file -bi "$f"` ; done
UCHARDET - 모질라에서 포팅 된 인코딩 검출기 라이브러리.
용법:
~> uchardet file.java
UTF-8
다양한 Linux 배포판 (Debian/Ubuntu, OpenSuse-Packman, ...)은 이항을 제공합니다.
다음은 MacOSX에서 작동하는 File -I 및 Iconv를 사용하는 예제 스크립트입니다. 질문에 대해 ICONV 대신 MV를 사용해야합니다.
#!/bin/bash
# 2016-02-08
# check encoding and convert files
for f in *.java
do
encoding=`file -I $f | cut -f 2 -d";" | cut -f 2 -d=`
case $encoding in
iso-8859-1)
iconv -f iso8859-1 -t utf-8 $f > $f.utf8
mv $f.utf8 $f
;;
esac
done
그것이 ISO-8859-1인지 판단하기가 정말 어렵습니다. ISO-8859-1 일 수있는 7 개의 비트 문자 만있는 텍스트가 있다면 모릅니다. 8 개의 비트 문자가있는 경우 상단 영역 문자가 인코딩 순서대로 존재합니다. 따라서 당신은 어떤 단어인지 더 잘 추측하고 어떤 글자인지 결정하기 위해 사전을 사용해야합니다. 마지막으로 UTF-8 일 수 있음을 감지하면 ISO-8859-1이 아니라고 확신합니다.
인코딩은 당신이 말하는 것이 아무것도 알지 못하기 때문에 가장 어려운 일 중 하나입니다.
Python을 사용하면 Chardet 모듈을 사용할 수 있습니다. https://github.com/chardet/chardet
Debian에서는 다음을 사용할 수 있습니다. encguess
:
$ encguess test.txt
test.txt US-ASCII
이것은 당신이 완벽한 방식으로 할 수있는 일이 아닙니다. 한 가지 가능성은 파일의 모든 문자를 검사하여 범위에 문자가 포함되지 않도록하는 것입니다. 0x00 - 0x1f
또는 0x7f -0x9f
그러나 내가 말했듯이, 이것은 적어도 하나의 다른 ISO8859를 포함하여 여러 파일의 경우에 해당 될 수 있습니다.
또 다른 가능성은 지원되는 모든 언어로 파일의 특정 단어를 찾아서 찾을 수 있는지 확인하는 것입니다.
예를 들어, 8859-1의 모든 지원되는 언어에서 영어 "및", ",", ","to "," "등의 동등한 것을 찾아서 파일.
나는 다음과 같은 문자적인 번역에 대해 말하는 것이 아닙니다.
English French
------- ------
of de, du
and et
the le, la, les
가능하지만 가능합니다. 나는 대상 언어의 일반적인 단어에 대해 이야기하고 있습니다 (내가 아는 모든 것에 대해 아이슬란드 주의자는 "와" - " - 당신은 아마도"fish "에 그들의 단어를 사용해야 할 것입니다. 지점을 보여주는 범죄를 의미합니다.)).
XML-Files (ISO-8859-1)에 대해 이야기하고 있다면, 그 안에있는 XML-reclaration은 인코딩을 지정합니다. <?xml version="1.0" encoding="ISO-8859-1" ?>
따라서 정규 표현식을 사용할 수 있습니다 (예 : perl
) 모든 파일에서 그러한 사양을 확인합니다.
자세한 내용은 여기를 참조하십시오. 텍스트 파일 인코딩을 결정하는 방법.
인코딩을 8859에서 ASCII로 변환하려면 :
iconv -f ISO_8859-1 -t ASCII filename.txt
나는 당신이 더 일반적인 대답에 관심이 있다는 것을 알고 있지만 ASCII에서 좋은 것은 일반적으로 다른 인코딩에서 좋습니다. 다음은 표준 입력이 ASCII인지 확인하기위한 파이썬 원 라이너입니다. (나는 이것이 Python 2에서 작동한다고 확신하지만 Python 3에서만 테스트했습니다.)
python -c 'from sys import exit,stdin;exit()if 128>max(c for l in open(stdin.fileno(),"b") for c in l) else exit("Not ASCII")' < myfile.txt
Cygwin에서 이것은 나에게 효과가있는 것처럼 보입니다.
find -type f -name "<FILENAME_GLOB>" | while read <VAR>; do (file -i "$<VAR>"); done
예시:
find -type f -name "*.txt" | while read file; do (file -i "$file"); done
ICONV에서 지원하는 모든 소스에서 모든 것을 UTF8로 변환하기 위해 ICONV 명령을 생성 할 수 있습니다.
예시:
find -type f -name "*.txt" | while read file; do (file -i "$file"); done | awk -F[:=] '{print "iconv -f "$3" -t utf8 \""$1"\" > \""$1"_utf8\""}' | bash
파일 명령으로 단일 파일의 인코딩을 추출 할 수 있습니다. 다음과 같은 Sample.html 파일이 있습니다.
$ file sample.html
Sample.html : HTML 문서, UTF-8 유니 코드 텍스트, 매우 긴 줄이 있습니다.
$ file -b sample.html
HTML 문서, UTF-8 유니 코드 텍스트, 매우 긴 줄이 있습니다.
$ file -bi sample.html
텍스트/html; charset = UTF-8
$ file -bi sample.html | awk -F'=' '{print $2 }'
UTF-8
다음 스크립트를 사용하고 있습니다
- SRC_Encoding과 필터를 일치하는 모든 파일을 찾으십시오
- 그들의 백업을 만듭니다
- dst_encoding으로 변환하십시오
- (선택 사항) 백업을 제거합니다
.
#!/bin/bash -xe
SRC_ENCODING="iso-8859-1"
DST_ENCODING="utf-8"
FILTER="*.java"
echo "Find all files that match the encoding $SRC_ENCODING and filter $FILTER"
FOUND_FILES=$(find . -iname "$FILTER" -exec file -i {} \; | grep "$SRC_ENCODING" | grep -Eo '^.*\.java')
for FILE in $FOUND_FILES ; do
ORIGINAL_FILE="$FILE.$SRC_ENCODING.bkp"
echo "Backup original file to $ORIGINAL_FILE"
mv "$FILE" "$ORIGINAL_FILE"
echo "converting $FILE from $SRC_ENCODING to $DST_ENCODING"
iconv -f "$SRC_ENCODING" -t "$DST_ENCODING" "$ORIGINAL_FILE" -o "$FILE"
done
echo "Deleting backups"
find . -iname "*.$SRC_ENCODING.bkp" -exec rm {} \;
Perl을 사용하면 Encode :: Detect를 사용하십시오.