스크립트를 통해 Unix에서 파일 인코딩을 찾는 방법
디렉토리에있는 모든 파일의 인코딩을 찾아야합니다. 사용 된 인코딩을 찾는 방법이 있습니까?
file
명령은이 작업을 수행 할 수 없습니다.
관심있는 인코딩은 ISO-8859-1입니다. 인코딩이 다른 것이라면 파일을 다른 디렉토리로 옮기고 싶습니다.
찾고있는 것 같습니다 enca
. 인코딩을 추측하고 변환 할 수도 있습니다. 그냥 보는 사람이 페이지 .
또는 실패하면 file -i
(linux) 또는 file -I
(osx)를 사용하십시오. 파일에 대한 MIME 유형 정보가 출력되며 문자 세트 인코딩도 포함됩니다. 나는 그것에 대한 맨 페이지도 발견 했다. :)
file -bi <file name>
많은 파일에 대해이 작업을 수행하려는 경우
for f in `find | egrep -v Eliminate`; do echo "$f" ' -- ' `file -bi "$f"` ; done
uchardet -Mozilla에서 포팅 된 인코딩 검출기 라이브러리.
용법:
~> uchardet file.java
UTF-8
다양한 Linux 배포판 (Debian / Ubuntu, OpenSuse-packman 등)은 바이너리를 제공합니다.
다음은 MacOsX에서 작동하는 파일 -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
데비안에서는 다음을 사용할 수도 있습니다. encguess
:
$ encguess test.txt
test.txt US-ASCII
인코딩을 8859에서 ASCII로 변환하려면
iconv -f ISO_8859-1 -t ASCII filename.txt
이것은 당신이 완벽하게 할 수있는 일이 아닙니다. 하나의 가능성은 범위의 모든 문자가 포함되지 않도록 파일에 모든 문자를 조사하는 것 0x00 - 0x1f
또는 0x7f -0x9f
내가 말했듯이,이 ISO8859의 적어도 하나 개의 다른 변종을 포함하여 파일의 수에 대한 진실 일 수 있지만.
또 다른 가능성은 지원되는 모든 언어로 파일에서 특정 단어를 찾아서 찾을 수 있는지 확인하는 것입니다.
예를 들어 지원되는 모든 언어 8859-1에서 영어 "and", "but", "to", "of"등을 찾아서 파일.
나는 다음과 같은 리터럴 번역에 대해 이야기하지 않습니다.
English French
------- ------
of de, du
and et
the le, la, les
가능하지만. 나는 대상 언어로 일반적인 단어에 대해 이야기하고 있습니다. (아이슬란드 어에는 "and"에 대한 단어가 없습니다. "fish"에 대한 단어를 사용해야 할 것입니다. 요점을 설명하는 모든 범죄를 의미합니다]).
XML 파일 (ISO-8859-1)에 대해 이야기하고 있다면, 그 안의 XML 선언은 인코딩을 지정합니다. <?xml version="1.0" encoding="ISO-8859-1" ?>
따라서 정규 표현식 (예 :)을 사용 perl
하여 모든 파일에서 해당 사양을 확인할 수 있습니다 .
자세한 내용은 텍스트 파일 인코딩을 결정하는 방법을 참조하십시오 .
좀 더 일반적인 답변에 관심이 있다는 것을 알고 있지만 ASCII의 장점은 다른 인코딩에 일반적입니다. 다음은 표준 입력이 ASCII인지 확인하기위한 Python one-liner입니다. (이것은 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로 변환하는 awk로 파이프하고 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
file 명령을 사용하여 단일 파일의 인코딩을 추출 할 수 있습니다. 다음과 같은 sample.html 파일이 있습니다.
$ file sample.html
sample.html : 매우 긴 행이있는 HTML 문서, UTF-8 유니 코드 텍스트
$ file -b sample.html
매우 긴 행이있는 HTML 문서, UTF-8 유니 코드 텍스트
$ file -bi sample.html
텍스트 / html; 문자 집합 = UTF-8
$ file -bi sample.html | awk -F'=' '{print $2 }'
utf-8
다음 스크립트를 사용하여
- FILTER와 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 {} \;
PHP에서는 다음과 같이 확인할 수 있습니다.
인코딩 목록을 명시 적으로 지정 :
php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1') . PHP_EOL;"
보다 정확한 "mb_list_encodings":
php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()) . PHP_EOL;"
여기 첫 번째 예에서 일치하는 인코딩 목록 (목록 순서 감지)을 넣었 음을 알 수 있습니다. 보다 정확한 결과를 얻으려면 다음을 통해 가능한 모든 인코딩을 사용할 수 있습니다. mb_list_encodings ()
mb_ * 함수에는 php-mbstring이 필요합니다
apt-get install php-mbstring
이 명령으로 :
for f in `find .`; do echo `file -i "$f"`; done
디렉토리 및 하위 디렉토리의 모든 파일과 해당 인코딩을 나열 할 수 있습니다.
Perl에서는 Encode :: Detect를 사용하십시오.
참고 URL : https://stackoverflow.com/questions/805418/how-to-find-encoding-of-a-file-in-unix-via-scripts
'Programing' 카테고리의 다른 글
'else if'의 올바른 구문은 무엇입니까? (0) | 2020.03.26 |
---|---|
git-mv의 목적은 무엇입니까? (0) | 2020.03.26 |
태그 또는 태그 지정을위한 권장 SQL 데이터베이스 디자인 (0) | 2020.03.26 |
bash에서 현재 사용자의 사용자 이름을 얻습니까? (0) | 2020.03.26 |
텍스트 영역의 비정상적인 모양? (0) | 2020.03.26 |