2011-06-22 16 views
0

GBKからUTF-8に変換するファイルの一部を変換しようとしています。Mac OS Xでoperator '>'の後に 'find'コマンドを使用できませんでした

Linuxで次のコマンドを実行しても大丈夫です。

find Bnf -type f -exec iconv -f GBK -t UTF-8 {} -o utf8/{} \; 

しかし、Mac OS Xで、iconvのは、-oオプションでない、すべての出力は標準出力になります。

だから、私はにコマンドを変更:

find Bnf -type f -exec iconv -f GBK -t UTF-8 {} > utf8/{} \; 

しかし、最後の「{}」ファイルのパスに置き換えられていなかったが、リテラル残っていました。

おそらく、私はiconvと演算子 '>'をラッパーするためのbashスクリプトを作成できましたが、それを動作させるにはより良い方法がありますか?

ありがとうございました。

+1

あなた '>' 'find'を実行するシェルによって解釈なっています。 '\>'のようにエスケープしてみてください。 – Gabe

+0

@Gabe、そのトリックを教えてくれてありがとう。私の問題を理解するのに大いに役立ちます。 – Logan

答えて

2

findの外側にiconvを実行する方がよいです。おそらく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 
+0

そこにベース名を入れてはいけません。その時点で元のものを修正しました。 –

+0

@ x-istenceなぜですか? 'find'は" Bnf/foo "を出力します。リダイレクトは "utf8/Bnf/foo"にする必要があります。 findはmkdir()を呼び出しません。 – mattn

+0

basename "Bnf/foo"は "foo"になるので、utf8/fooに格納しますが、findの例では "utf8/Bnf/foo"に格納されます(ディレクトリの作成方法は不明です... ) –

関連する問題