本文目录导读:

在Shell脚本中转换文件编码格式,常用的方法有以下几种:
使用 iconv 命令 (最常用)
# 基本语法 iconv -f 原编码 -t 目标编码 输入文件 -o 输出文件 # 示例:将GBK编码转换为UTF-8 iconv -f gbk -t utf-8 input.txt -o output.txt # 直接覆盖原文件 iconv -f gbk -t utf-8 input.txt > input.txt.tmp && mv input.txt.tmp input.txt
批量转换多个文件
#!/bin/bash
# 批量转换当前目录下所有.txt文件
for file in *.txt; do
if [ -f "$file" ]; then
iconv -f gbk -t utf-8 "$file" > "${file}.utf8"
mv "${file}.utf8" "$file"
echo "已转换: $file"
fi
done
递归转换目录下所有文件
#!/bin/bash
# 递归转换目录下所有指定类型的文件
convert_encoding() {
local dir="$1"
local ext="$2" # 文件扩展名
find "$dir" -name "*.$ext" -type f | while read -r file; do
echo "正在转换: $file"
iconv -f gbk -t utf-8 "$file" > "${file}.tmp" && mv "${file}.tmp" "$file"
done
}
# 使用示例:转换当前目录所有.java文件
convert_encoding "." "java"
自动检测编码并转换
#!/bin/bash
# 使用 file 命令检测编码
convert_with_auto_detect() {
local file="$1"
local encoding=$(file -bi "$file" | sed 's/.*charset=//')
echo "检测到编码: $encoding"
case "$encoding" in
utf-8|us-ascii)
echo "已经是UTF-8编码,跳过"
;;
iso-8859-1|iso-8859-2|utf-16*)
iconv -f "$encoding" -t utf-8 "$file" > "${file}.utf8" && mv "${file}.utf8" "$file"
;;
*)
echo "未知编码: $encoding,尝试转换为UTF-8"
iconv -f "$encoding" -t utf-8 "$file" > "${file}.utf8" 2>/dev/null && mv "${file}.utf8" "$file" || echo "转换失败"
;;
esac
}
convert_with_auto_detect "example.txt"
使用 enca 工具(需要安装)
# 安装 enca
# Ubuntu/Debian: sudo apt-get install enca
# CentOS/RHEL: sudo yum install enca
#!/bin/bash
# 自动检测并转换编码
for file in *.txt; do
if [ -f "$file" ]; then
# 检测编码
ENCODING=$(enca -L zh "$file" 2>/dev/null)
if [ "$ENCODING" != "UTF-8" ]; then
# 转换为UTF-8
enconv -L zh -x utf8 "$file"
echo "已转换: $file (原编码: $ENCODING)"
else
echo "跳过: $file (已经是UTF-8)"
fi
fi
done
完整的Shell脚本模板
#!/bin/bash
# 文件编码转换脚本
# 用法: ./convert_encoding.sh [目录] [扩展名]
DEFAULT_DIR="."
DEFAULT_EXT="txt"
TARGET_ENCODING="utf-8"
# 参数处理
SEARCH_DIR="${1:-$DEFAULT_DIR}"
FILE_EXT="${2:-$DEFAULT_EXT}"
# 支持的源编码列表(按优先级)
SOURCE_ENCODINGS=(
"gbk"
"gb2312"
"big5"
"shift-jis"
"euc-jp"
"euc-kr"
"iso-8859-1"
"windows-1252"
)
echo "开始转换 $SEARCH_DIR 目录下的所有 .$FILE_EXT 文件"
echo "目标编码: $TARGET_ENCODING"
echo "-----------------------------------"
convert_file() {
local file="$1"
local retries=0
local max_retries=${#SOURCE_ENCODINGS[@]}
while [ $retries -lt $max_retries ]; do
local encoding="${SOURCE_ENCODINGS[$retries]}"
if iconv -f "$encoding" -t "$TARGET_ENCODING" "$file" > "${file}.tmp" 2>/dev/null; then
if [ -s "${file}.tmp" ]; then # 检查文件是否为空
mv "${file}.tmp" "$file"
echo "[成功] 使用 $encoding 编码转换: $file"
return 0
fi
fi
((retries++))
done
echo "[失败] 无法转换: $file"
rm -f "${file}.tmp"
return 1
}
export -f convert_file
# 查找并转换文件
find "$SEARCH_DIR" -name "*.$FILE_EXT" -type f | while read -r file; do
convert_file "$file"
done
echo "-----------------------------------"
echo "转换完成!"
常用编码格式对照
| 区域 | 常见编码 |
|---|---|
| 中文(简体) | GBK, GB2312, GB18030 |
| 中文(繁体) | Big5, Big5-HKSCS |
| 日文 | Shift_JIS, EUC-JP, ISO-2022-JP |
| 韩文 | EUC-KR |
| 通用 | UTF-8, UTF-16, ASCII |
使用示例
# 1. 基本转换 iconv -f gbk -t utf-8 input.txt -o output.txt # 2. 批量转换js文件 ./convert_encoding.sh ./src js # 3. 自动检测并转换 ./convert_encoding.sh ./documents txt # 4. 查看文件编码 file -i filename.txt
注意事项
- 备份文件:转换前建议先备份重要文件
- 兼容性:GBK包含GB2312,但GBK不能完全转换为GB2312
- 验证转换:转换后使用
file -i检查编码 - 特殊字符:某些特殊字符可能导致转换失败
- 大文件处理:大文件转换可能较慢,考虑分批处理
这个脚本可以根据你的具体需求进行调整和扩展。