Как найти кодировку файла в Unix через скрипт (ы) - PullRequest
249 голосов
/ 30 апреля 2009

Мне нужно найти кодировку всех файлов, которые находятся в каталоге. Есть ли способ найти используемую кодировку?

Команда file не может этого сделать.

Кодировка, которая представляет для меня интерес: ISO-8859-1. Если кодировка - что-то еще, я хочу переместить файл в другой каталог.

Ответы [ 15 ]

1 голос
/ 30 мая 2012

Я знаю, что вы заинтересованы в более общем ответе, но то, что хорошо в ASCII, обычно хорошо в других кодировках. Вот строка Python, чтобы определить, является ли стандартный ввод 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
0 голосов
/ 05 сентября 2018

Я использую следующий скрипт для

  1. Найти все файлы, которые соответствуют FILTER с SRC_ENCODING
  2. Создать из них резервную копию
  3. Конвертировать их в DST_ENCODING
  4. (необязательно) Удалить резервные копии

.

#!/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 {} \;
0 голосов
/ 05 апреля 2018

Вы можете извлечь кодировку из одного файла с помощью команды file. У меня есть файл sample.html с:

$ file sample.html 

sample.html: документ HTML, текст в кодировке UTF-8 Unicode с очень длинными строками

$ file -b sample.html

HTML-документ, текст в кодировке UTF-8 Unicode, с очень длинными строками

$ file -bi sample.html

Текст / html; кодировка = UTF-8 * +1010 *

$ file -bi sample.html  | awk -F'=' '{print $2 }'

UTF-8

0 голосов
/ 27 мая 2017

В 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

Вы можете передать это в awk и создать команду 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
0 голосов
/ 23 января 2012

В Perl используйте Encode :: Detect.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...