本文目录导读:

在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检查编码 - 特殊字符:某些特殊字符可能导致转换失败
- 大文件处理:大文件转换可能较慢,考虑分批处理
这个脚本可以根据你的具体需求进行调整和扩展。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播