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

file命令不能做到这一点。

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


当前回答

使用这个命令:

for f in `find .`; do echo `file -i "$f"`; done

您可以列出一个目录和子目录中的所有文件以及相应的编码。

如果文件名称中有空格,请使用:

IFS=$'\n'
for f in `find .`; do echo `file -i "$f"`; done

记住,它会将当前Bash会话解释器更改为“空格”。

其他回答

在Python中,你可以使用chardet模块。

file -bi <file name>

如果你喜欢对一堆文件这样做

for f in `find | egrep -v Eliminate`; do echo "$f" ' -- ' `file -bi "$f"` ; done

下面是一个在Mac OS X上使用file -I和iconv的示例脚本。

对于你的问题,你需要使用mv而不是iconv:

#!/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

我在一个需要跨平台支持的项目中工作,遇到了很多与文件编码相关的问题。

我做了这个脚本来转换所有的utf-8:

#!/bin/bash
## Retrieve the encoding of files and convert them
for f  `find "$1" -regextype posix-egrep -regex ".*\.(cpp|h)$"`; do
  echo "file: $f"
  ## Reads the entire file and get the enconding
  bytes_to_scan=$(wc -c < $f)
  encoding=`file -b --mime-encoding -P bytes=$bytes_to_scan $f`
  case $encoding in
    iso-8859-1 | euc-kr)
    iconv -f euc-kr -t utf-8 $f > $f.utf8
    mv $f.utf8 $f
    ;;
  esac
done

我使用了一个黑客来读取整个文件,并使用文件-b——mime-encoding -P bytes=$bytes_to_scan $f估计文件编码

真的很难确定它是否是ISO 8859-1。如果你有一个只有7位字符的文本,也可能是ISO 8859-1,但你不知道。如果你有8位字符,那么上区域字符也存在于顺序编码中。因此,你必须使用字典来更好地猜测它是哪个单词,并从中确定它必须是哪个字母。最后,如果您检测到它可能是UTF-8,那么您可以确定它不是ISO 8859-1。

编码是最难做的事情之一,因为你永远不知道是否没有任何东西告诉你。