我需要找到放在一个目录中的所有文件的编码。有没有办法找到所使用的编码?

file命令不能做到这一点。

我感兴趣的编码是ISO 8859-1。如果是其他编码,我想将文件移动到另一个目录。


当前回答

在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命令,将所有内容从iconv支持的任何源编码转换为UTF-8。

例子:

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

其他回答

在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命令,将所有内容从iconv支持的任何源编码转换为UTF-8。

例子:

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 -i (Linux)或file -i (OS X)。这将输出文件的mime类型信息,其中还将包括字符集编码。我也找到了它的手册页:)

这不是一件万无一失的事情。一种可能是检查文件中的每个字符,以确保它不包含0x00 - 0x1f或0x7f -0x9f范围内的任何字符,但正如我所说,这可能适用于任何数量的文件,包括至少一个ISO 8859的其他变体。

另一种可能是在文件中以所有支持的语言查找特定的单词,看看是否能找到它们。

因此,例如,在ISO 8859-1支持的所有语言中,找到与英语“and”、“but”、“to”、“of”等等价的单词,并查看它们是否在文件中大量出现。

我说的不是直译,比如:

English   French
-------   ------
of        de, du
and       et
the       le, la, les

尽管这是可能的。我说的是目标语言中的常用词(据我所知,冰岛语中没有“和”这个词——你可能得用他们的词来表示“鱼”[抱歉,这有点老套]。我没有任何冒犯的意思,只是说明一个观点)。

我正在使用以下脚本

找到所有匹配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 {} \;

如果谈论的是XML文件(ISO-8859-1),其中的XML声明指定了编码:<??> . xml version="1.0" encoding="ISO-8859-1" 因此,您可以使用正则表达式(例如,使用Perl)来检查每个文件是否有这样的规范。

更多信息可以在这里找到:如何确定文本文件编码。