我需要找到放在一个目录中的所有文件的编码。有没有办法找到所使用的编码?
file命令不能做到这一点。
我感兴趣的编码是ISO 8859-1。如果是其他编码,我想将文件移动到另一个目录。
我需要找到放在一个目录中的所有文件的编码。有没有办法找到所使用的编码?
file命令不能做到这一点。
我感兴趣的编码是ISO 8859-1。如果是其他编码,我想将文件移动到另一个目录。
当前回答
我正在使用以下脚本
找到所有匹配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 {} \;
其他回答
这不是一件万无一失的事情。一种可能是检查文件中的每个字符,以确保它不包含0x00 - 0x1f或0x7f -0x9f范围内的任何字符,但正如我所说,这可能适用于任何数量的文件,包括至少一个ISO 8859的其他变体。
另一种可能是在文件中以所有支持的语言查找特定的单词,看看是否能找到它们。
因此,例如,在ISO 8859-1支持的所有语言中,找到与英语“and”、“but”、“to”、“of”等等价的单词,并查看它们是否在文件中大量出现。
我说的不是直译,比如:
English French
------- ------
of de, du
and et
the le, la, les
尽管这是可能的。我说的是目标语言中的常用词(据我所知,冰岛语中没有“和”这个词——你可能得用他们的词来表示“鱼”[抱歉,这有点老套]。我没有任何冒犯的意思,只是说明一个观点)。
您可以使用file命令提取单个文件的编码。我有一个sample.html文件:
$ file sample.html
HTML: HTML文档,UTF-8 Unicode文本,有很长的行
$ file -b sample.html
HTML文档,UTF-8 Unicode文本,有很长的行
$ file -bi sample.html
短信/ html;charset = utf-8
$ file -bi sample.html | awk -F'=' '{print $2 }'
utf - 8
下面是一个在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
file -bi <file name>
如果你喜欢对一堆文件这样做
for f in `find | egrep -v Eliminate`; do echo "$f" ' -- ' `file -bi "$f"` ; done
使用这个命令:
for f in `find .`; do echo `file -i "$f"`; done
您可以列出一个目录和子目录中的所有文件以及相应的编码。
如果文件名称中有空格,请使用:
IFS=$'\n'
for f in `find .`; do echo `file -i "$f"`; done
记住,它会将当前Bash会话解释器更改为“空格”。