2012-03-13 43 views
3

所以, 我一直想一个大的Java源代码树从CP1252转换为UTF-8在Windows中,使用技巧和TRIX我在网上找到,specificly here。问题是,我在Windows上;我不做VB; Cygwin的iconv不采用-o开关。批量转换CP1252为UTF-8在Windows

我第一次尝试使用该生产线是:

find . -type f -print -exec iconv -f cp1252 -t utf-8 {} > {}.converted \; -exec mv {}.converted {} \; 

这在工作目录下创建一个文件{}.converted和第二-exec失败的原因很明显。周围的iconv表达

把报价:

find . -type f -print -exec 'iconv -f cp1252 -t utf-8 {} > {}.converted' \; -exec mv {}.converted {} \; 

resulsts在如下因素的错误:

find: `iconv -f cp1252 -t utf-8 ./java/dv/framework/activity/model/ActivitiesMediaViewImpl.java > ./java/dv/framework/activity/model/ActivitiesMediaViewImpl.java.converted': No such file or directory 

虽然手工执行的个人表现完美。

我已经试验了随机引用,但似乎没有工作,我错过了什么?为什么它不工作..?

Thanx提前, 拉尔斯

回答

3
for f in `find . -type f`; do 
    iconv -f cp1252 -t utf-8 $f > $f.converted 
    mv $f.converted $f 
done 
+0

感谢名单,这按预期工作! 但是,你知道为什么find-exec表达式不起作用吗?是否与输出重定向有关? – Larsing 2012-03-14 08:29:23

+0

我不确定,但'-exec'不是首选。从我学习的地方'-exec'不能执行长参数的命令。我使用'xargs'代替。 – neevek 2012-03-14 11:45:20

0

我没有使用Cygwin的非常多,但有一个语言Iconv的“原生” Windows版本,我用所有的时间。下面是一个批处理文件的摘录,我用它将子目录中的所有文件从HP-ROMAN8编码转换为UTF-8编码 - 将结果'./temp“放在原始文件的下方:

@set DIR =原

@set ICONV = “C:\ Program Files文件(x86)的\的iconv-1.9.2.win32 \ BIN \的iconv”

是否存在\%DIR%\ TEMP( 擦除。 \%DIR%\ TEMP * @if ERRORLEVEL 1(@echo无法从 “临时” 子目录 删除所有文件@goto THE_END ) )其他( 的mkdir \%目录。*/Q %\临时 @if ERRORLEVEL 1(@echo无法创建 “TEMP” 子目录 @goto THE_END ) )

为%% F IN(./%dir%/*.xml)做( % ICONV%-f HP-ROMAN8 -t UTF-8 “./%dir%/%%f”> “./%dir%/temp/%%f” 如果ERRORLEVEL 1(转到ICONV_ERROR) )

+1

看到...这就是为什么我更喜欢unix one-liners ;-) – Larsing 2012-04-18 06:43:10

1

好吧,再次回答我自己的问题(这开始成为一个坏习惯...)

所有虽然Neevek的解决方案没有错,完美主义者在我想要得到th e找到-exec表达式的权利。包裹在一个sh -c '...'中的iconv声明不招:

find . -type f -print -exec sh -c 'iconv -f cp1252 -t utf-8 {} > {}.converted' \; -exec mv {}.converted {} \; 

尽管如此,为什么会出现使用查找-exec语句I/O重定向问题的基本问题仍然没有得到解决......