用ShellScript批量轉換文件的編碼

最近研究了下ShellScript,寫了一個工具,來批量轉換文件的編碼為UTF-8,理論上應該支持Linux和MacOSX,現貼出源碼:

聲明:該Script有刪除源文件的操作,在使用前請先備份,因此而造成數據丟失的本人概不負責!


#!/bin/bash
function usage() {
	echo "";
	echo "Usage: tencoder <dest_dir> <from_encode>";
	echo "";
	exit 1;
}

function test_encode() {
	echo "Test encoded file." >> ~/test_encoded.tmp;
	iconv -f $2 -t UTF8 ~/test_encoded.tmp > ~/test_encoded.tmp || exec sh -c "rm -f ~/test_encoded.tmp; exit 1;";
	rm -f ~/test_encoded.tmp;
}

function delete_old_encoded_files() {
	for file in `ls $1`
	do
		if test -d $1"/"$file; then
			delete_old_encoded_files $1"/"$file;
		fi
	done
	
	for file in `ls $1 | grep encoded_utf8`
	do
		rm -f $1"/"$file;
	done
}

function doencode() {
	#轉碼為utf-8
	for file in `ls $1`
	do
		local filepath=$1"/"$file
		#只對文件編碼轉換,文件夾略過
		if [ ! -d $filepath ]; then
			#如果轉換成功,刪除原文件,並把轉換後的文件重命名為原文件的名字
			if (iconv -f $2 -t UTF8 $filepath > $filepath.encoded_utf8) ; then
				rm -f $filepath;
				mv $filepath.encoded_utf8 $filepath;
			#否則,則轉失敗(可能是圖片文件),刪除轉換時產生的臨時文件,保留舊的原文件
			else 
				rm -f $filepath.encoded_utf8;
			fi
		fi
	done
} 

#遍歷所有文件夾
function iterate() {
	for file in `ls $1`
	do
		if test -d $1"/"$file; then
			iterate $1"/"$file $2;
		fi
	done
	doencode $1 $2;
}

#如果參數不等於2,顯示用法
if [ $# -ne 2 ]; then
	usage

#如果參數1不是一個目錄的路徑,提示錯誤	
elif [ ! -d $1 ]; then
	echo "";
	echo "No such diretory -> $1"
	echo "";
	exit 1;
else
	#測試參數2(該編碼是否正確)
	test_encode $1 $2;
	#刪除以前的encode過的文件
	delete_old_encoded_files $1;
	#開始遍歷
	iterate $1 $2;
fi


使用方法:

將該段script復制保存為文件,如utf8encoder.sh,加上運行權限,使用格式如下:

# utf8encoder.sh <需要轉編碼的文件夾> <源編碼格式>


例:

# utf8encoder.sh /Users/tim/myfolder GB18030

你可能感兴趣的:(utf8,utf8,gb18030,gb18030,shellScript,亂碼,轉碼)