Answers:
这是行不通的,因为iconv
首先创建输出文件(因为该文件已经存在,它将被截断),然后开始读取其输入文件(现在为空)。大多数程序都以这种方式运行。
为输出创建一个新的临时文件,然后将其移动到位。
for file in *.php
do
iconv -f cp1251 -t utf8 -o "$file.new" "$file" &&
mv -f "$file.new" "$file"
done
如果您的平台iconv
没有-o
,则可以使用Shell重定向达到相同的效果。
for file in *.php
do
iconv -f cp1251 -t utf8 "$file" >"$file.new" &&
mv -f "$file.new" "$file"
done
Colin Watson的sponge
实用程序(包括在Joey Hess的moreutils中)使此操作自动化:
for file in *.php
do
iconv -f cp1251 -t utf8 "$file" | sponge "$file"
done
这个答案不仅适用iconv
于任何过滤程序,还适用于任何过滤程序。值得一提的一些特殊情况:
-p
可以-i
选择替换文件。grep
,tr
,sed 's/long input text/shorter text/'
),你喜欢住危险的是,你可能要真正修改文件的地方(这里提到的其他解决方案创建新的输出文件并将其移到末尾,因此,如果由于任何原因中断了该命令,原始数据将保持不变。sponge
应仅归因于Joey Hess。它的包装moreutils
,包括sponge
他坚持,但至于起源sponge
,通过跟踪的网页的链接moreutils
,我发现它最初发布,并建议纳入科林·沃森:“乔伊写关于缺乏新的工具,符合Unix的哲学。我写的这类文章中我最喜欢的是sponge
“(2006年2月6日,星期一)。
iconv -f cp1251 -t utf8 "$file" > "$file.new"
sort
)在-o
参数方面非常聪明,如果它们检测到输出文件与输入相同,则它们在内部管理一个临时文件,因此它可以正常工作。
一个替代方法是recode
,它使用libiconv库进行某些转换。它的行为是用输出替换输入文件,因此可以正常工作:
for file in *.php
do
recode cp1251..utf8 "$file"
done
由于recode
接受多个输入文件作为参数,因此可以节省for
循环:
recode cp1251..utf8 *.php
info recode
。更冗长。
这是一个简单的例子。它应该为您提供足够的信息以开始使用。
#!/bin/bash
#conversor.sh
#Author.....: dede.exe
#E-mail.....: dede.exe@gmail.com
#Description: Convert all files to a another format
# It's not a safe way to do it...
# Just a desperate script to save my life...
# Use it such a last resort...
to_format="utf8"
file_pattern="*.java"
files=`find . -name "${file_pattern}"`
echo "==================== CONVERTING ===================="
#Try convert all files in the structure
for file_name in ${files}
do
#Get file format
file_format=`file $file_name --mime-encoding | cut -d":" -f2 | sed -e 's/ //g'`
if [ $file_format != $to_format ]; then
file_tmp="${unit_file}.tmp"
#Rename the file to a temporary file
mv $file_name $file_tmp
#Create a new file with a new format.
iconv -f $file_format -t $to_format $file_tmp > $file_name
#Remove the temporary file
rm $file_tmp
echo "File Name...: $file_name"
echo "From Format.: $file_format"
echo "To Format...: $to_format"
echo "---------------------------------------------------"
fi
done;
一种选择是使用perl
的接口iconv
及其-i
模式进行就地编辑:
perl -MText::Iconv -i -pe '
BEGIN{$i=Text::Iconv->new(qw(cp1252 UTF-8));$i->raise_error(1)}
$_ = $i->convert($_)' ./*.php
使用GNU awk
,您还可以执行以下操作:
gawk -v cmd='iconv -f cp1252 -t utf-8' -i inplace '
{print | cmd}; ENDFILE {close(cmd)}' ./*.php
该ksh93
外壳还具有>;
为运营商存储在其重命名为重定向文件,如果命令是成功的一个临时文件的输出:
for f in *.php; do
iconv -f cp1252 -t utf-8 < $f >; $f
done