所以,
我一直试图在Windows中将大型java源代码树从cp1252转换为UTF-8,使用我在网上发现的提示和解决方案,特别是here。问题是,我在Windows上;我不做VB; Cygwin的iconv没有进行-o
切换。
我首先尝试使用的是:
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 {} \;
导致以下错误:
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提前, 拉斯
答案 0 :(得分:3)
for f in `find . -type f`; do
iconv -f cp1252 -t utf-8 $f > $f.converted
mv $f.converted $f
done
答案 1 :(得分:1)
好吧,再次回答我自己的问题(这已经开始成为一个坏习惯......)
尽管Neevek的解决方案没有任何问题,但我的完美主义者希望找到-exec表达正确。在sh -c '...'
中包装iconv语句可以解决问题:
find . -type f -print -exec sh -c 'iconv -f cp1252 -t utf-8 {} > {}.converted' \; -exec mv {}.converted {} \;
但是,在查找-exec语句中使用i / o重定向时出现问题的根本问题仍未得到解决......
答案 2 :(得分:0)
我没有使用Cygwin,但是我一直使用的是“本机”Windows版本的Iconv。以下是我用于将子目录中的所有文件从HP-ROMAN8编码转换为UTF-8编码的批处理文件的摘录 - 将结果“./temp”放在原始文件下:
@set dir = original
@set ICONV =“C:\ Program Files(x86)\ iconv-1.9.2.win32 \ bin \ iconv”
如果是EXIST。\%dir%\ temp( 擦除。\%dir%\ temp *。* / Q. @if ERRORLEVEL 1(@echo无法清除“temp”子目录中的所有文件 @goto THE_END ) )其他( mkdir。\%dir%\ temp @if ERRORLEVEL 1(@echo无法创建“temp”子目录 @goto THE_END ) )
for %% f IN(./%dir%/*.xml)do( %ICONV%-f HP-ROMAN8 -t UTF-8“./%dir%/%%f”> “./%dir%/temp/%%f” 如果ERRORLEVEL 1(转到ICONV_ERROR) )
答案 3 :(得分:0)
第一次尝试中的错误是在查找开始之前外壳对重定向运算符'>'进行了评估。
第二次尝试中的错误是单引号之间的文本被解释为将由find执行的命令的名称,但是不存在。
在您的工作解决方案中,find要执行的第一个命令是一个子外壳,并且选项用单引号引起来,因此它们不是由外壳解释而是由子外壳解释。