Bash 命令';查找';,未能使用';{}';术后'&燃气轮机';在MacOSX中

Bash 命令';查找';,未能使用';{}';术后'&燃气轮机';在MacOSX中,bash,find,iconv,Bash,Find,Iconv,我将把一些文件的编码从GBK转换成UTF-8 可以在Linux中运行以下命令: find Bnf -type f -exec iconv -f GBK -t UTF-8 {} -o utf8/{} \; 但是在MacOSX中,iconv没有带-o选项,所有的输出都到标准输出 因此,我将命令更改为: find Bnf -type f -exec iconv -f GBK -t UTF-8 {} > utf8/{} \; 但是最后一个“{}”没有被文件路径替换,而是保留为文本 也许我可以创

我将把一些文件的编码从GBK转换成UTF-8

可以在Linux中运行以下命令:

find Bnf -type f -exec iconv -f GBK -t UTF-8 {} -o utf8/{} \;
但是在MacOSX中,iconv没有带-o选项,所有的输出都到标准输出

因此,我将命令更改为:

find Bnf -type f -exec iconv -f GBK -t UTF-8 {} > utf8/{} \;
但是最后一个“{}”没有被文件路径替换,而是保留为文本

也许我可以创建一个bash脚本来包装iconv和操作符'>',但是有更好的方法让它工作吗


谢谢。

您最好将iconv运行到find之外。也许,您应该运行basename

find Bnf -type f |\
while read line; do
  FILE=`basename $line`
  iconv -f GBK -t UTF-8 $line > utf8/$FILE
done
如果你想保持目录结构

find Bnf -type f |\
while read line; do
  mkdir -p utf8/`dirname $line` 2> /dev/null
  iconv -f GBK -t UTF-8 $line > utf8/$line
done

您的
正在被执行
find
的shell解释。试着像
\>
@Gabe那样逃离它,谢谢你告诉我这个窍门。这对我理解我的问题有很大帮助。不要在这里使用basename,此时您已经修改了原始的操作。@x-istence为什么<代码>查找输出“Bnf/foo”。然后重定向应该是“utf8/Bnf/foo”。find不调用mkdir()。因为basename“Bnf/foo”变为“foo”,所以它将存储在utf8/foo中,而在find示例中,它将存储在“utf8/Bnf/foo”中(不确定目录是如何创建的…)@x-istence您在上面是否确定?@mattn:您正在同一位置创建目录,需要在它前面加上utf8。