4

因此,我一直在尝试使用我在网上找到的提示和 trix 将大型 Java 源代码树从 cp1252 转换为 UTF-8,特别是在这里。问题是,我在 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

尽管手动执行单个表达式效果很好。

我已经尝试过随机引用,但似乎没有任何效果,我错过了什么?为什么它不起作用..?

提前谢谢,拉斯

4

4 回答 4

3
for f in `find . -type f`; do
    iconv -f cp1252 -t utf-8 $f > $f.converted
    mv $f.converted $f
done
于 2012-03-13T16:08:29.177 回答
1

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

尽管 Neevek 的解决方案没有任何问题,但我的完美主义者希望找到正确的 find -exec 表达式。将 iconv 语句包装在 ash -c '...'中就可以了:

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

尽管如此,为什么在 find -exec 语句中使用 i/o 重定向会出现问题的根本问题仍未解决......

于 2012-03-14T08:56:50.277 回答
0

我没有经常使用 Cygwin,但是我一直在使用 Iconv 的“本机”Windows 版本。这是我用来将子目录中的所有文件从 HP-ROMAN8 编码转换为 UTF-8 编码的批处理文件的摘录——将结果“./temp”放在原件下:

@set dir=原始

@set ICONV="C:\Program Files (x86)\iconv-1.9.2.win32\bin\iconv"

if EXIST .\%dir%\temp (erase .\%dir%\temp*.* /Q @if ERRORLEVEL 1 (@echo Unable to erase all files from the "temp" sub-directory @goto THE_END) ) else ( mkdir .\%dir%\temp @if ERRORLEVEL 1 (@echo Unable to create the "temp" 子目录 @goto THE_END )

对于 %%f IN (./%dir%/*.xml) 执行 ( %ICONV% -f HP-ROMAN8 -t UTF-8 "./%dir%/%%f" > "./%dir%/ temp/%%f" 如果 ERRORLEVEL 1 (goto ICONV_ERROR) )

于 2012-03-13T16:10:06.257 回答
0

第一次尝试的错误是重定向运算符“>”在 find 开始之前由 shell 评估。

第二次尝试的错误是单引号之间的文本被解释为要由 find 执行的命令的名称,但它不存在。

在您的工作解决方案中,find 执行的第一个命令是子shell,选项用单引号括起来,因此它们不是由外壳解释,而是由子shell 解释。

于 2020-01-03T15:03:08.137 回答