如何通过脚本在Unix中找到文件的编码

Man*_*glu 280 unix shell encoding file

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

file命令无法执行此操作.

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

Sha*_*mer 385

听起来像你在寻找enca.它可以猜测甚至在编码之间进行转换.只需看一下手册页.

或者,如果失败,请使用file -i(linux)或file -I(osx).这将输出文件的MIME类型信息,其中还包括字符集编码.我也找到了一个人工页面 :)

  • @vladkras如果你的utf-8文件中没有非ascii字符,那么它与ascii :)无法区分 (6认同)
  • 恩卡听起来很有趣.不幸的是,检测似乎非常依赖于语言,支持的语言集并不是很大.我(德)失踪:-(无论如何很酷的工具. (5认同)
  • "enca"对于分析用英语编写的文件似乎完全没用,但是如果你碰巧在爱沙尼亚语中看某些东西,它可能会解决你所有的问题.非常有用的工具,... </ sarcasm> (4认同)

小智 75

file -bi <file name>
Run Code Online (Sandbox Code Playgroud)

如果你喜欢为一堆文件做这个

for f in `find | egrep -v Eliminate`; do echo "$f" ' -- ' `file -bi "$f"` ; done
Run Code Online (Sandbox Code Playgroud)

  • 为什么使用-b参数?如果您只是执行文件-i*,它会为每个文件输出猜测的字符集. (6认同)
  • 我对-b参数也很好奇.手册页说它意味着"简短"`不要将文件名添加到输出行` (4认同)
  • 不需要解析文件输出,`file -b --mime-encoding` 只输出字符集编码 (3认同)
  • 执行此操作时我得到的只是“常规文件”作为输出 (2认同)

qwe*_*003 31

uchardet - 从Mozilla移植的编码检测器库.

用法:

~> uchardet file.java 
UTF-8
Run Code Online (Sandbox Code Playgroud)

各种Linux发行版(Debian/Ubuntu,OpenSuse-packman,...)提供二进制文件.

  • 谢谢!我对更多的软件包不满意,但是“sudo apt-get install uchardet”是如此简单,所以我决定不担心它...... (2认同)

not*_*bit 10

在 Debian 中,您还可以使用encguess

$ encguess test.txt
test.txt  US-ASCII
Run Code Online (Sandbox Code Playgroud)

  • 我在 Ubuntu 中安装了“uchardet”,它告诉我我的文件是“WINDOWS-1252”。我知道这是错误的,因为我和 Kate 一起将其保存为 UTF-16 以进行测试。然而,“encguess”猜测正确,并且它已预装在 Ubuntu 19.04 中。 (2认同)

Wol*_*ahl 9

这是一个使用文件-I和iconv的示例脚本,适用于MacOsX对于您的问题,您需要使用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
Run Code Online (Sandbox Code Playgroud)

  • `file -b --mime-encoding`只输出字符集,因此可以避免所有管道处理 (4认同)

小智 9

要将编码从 ISO 8859-1 转换为 ASCII:

iconv -f ISO_8859-1 -t ASCII filename.txt
Run Code Online (Sandbox Code Playgroud)


dan*_*ilo 7

使用此命令:

for f in `find .`; do echo `file -i "$f"`; done
Run Code Online (Sandbox Code Playgroud)

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

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

IFS=$'\n'
for f in `find .`; do echo `file -i "$f"`; done
Run Code Online (Sandbox Code Playgroud)

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


Nor*_*rtl 5

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

编码是最困难的事情之一,因为你永远都不知道是否有什么东西告诉你


fcc*_*lho 5

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