2012-10-18 4 views
21

多くの情報源は、{}のすべてのインスタンスが検索で見つかったファイル名に置き換えられますことを言うが、私は次のことを実行しようとすると、私は1件のテキストファイルと、その名前は「.TXT」"find -exec"で現在のファイル名( "{}")を複数回使用しますか?

find /directory -name "*pattern*" -exec cut -f8 {} > {}.txt \; 
あります

目的は、見つかった各ファイルから8番目の列のみを含むテキストファイルを作成することでした。各テキストファイルの名前は、親ファイルの名前になります。その2番目の{}セットが、見つかった各ファイルのファイル名に置き換えられていません。

答えて

22

試してみてください。

find /directory -name "*pattern*" -exec sh -c 'cut -f8 {} > {}.txt' \; 

しかし、いくつかのバージョンが異なった引数であることを{}が必要で見つけ、それ以外の場合は、ファイル名に{}を拡張しないことに注意してください。あなたがそれを回避することができます。

find /directory -name "*pattern*" -exec sh -c 'cut -f8 $0 > $0.txt' {} \; 

(この代替コマンドがマッチしたファイルを含むサブディレクトリに出力ファイルを置く必要であれば、あなたは${0#*/}

にリダイレクトすることにより、問題があることを避けることができました。 findがリダイレクトを行っていないことを、シェルは、あなたのコマンドでは、とまったく同じです:。標準から次

# Sample of INCORRECT code 
find /directory -name "*pattern*" -exec cut -f8 {} \; > {}.txt 

注:

2つの文字「{}」を含む複数の引数が存在する場合、その動作は指定されていません。

utility_nameまたは引数文字列に2つの文字 "{}"が含まれていて、 "{}"という2つの文字だけではない場合は、findがその2文字を置き換えるか、次を使用し、ウィリアムPursellは彼の答えで述べた警告に対処するために

+0

私の知る限り、あなたの修正はトリックでした。ありがとう! 私は>が誤解されているのだろうかと疑っていた – user1757862

10

find /directory -name "*pattern*" -exec sh -c 'cut -f8 "$1" > "$1.txt"' x {} \; 

あなたがsh -cを使用する場合、それが実行する文字列は、次の引数から位置パラメータを取得します。余分のx$0で、置換されたファイル名は$1となります。

二重引用符を使用すると、スペースやその他の特殊文字を含むファイル名で正しく動作します。

+0

+1:素敵なテクニック –

+0

$ 0を使わない理由:sh -c '... $ 0 ...' {} '? –

+0

主に「間違っている」と感じます。$ 0はシェルの名前であり、パラメータではありません。私はそこでそれを使用するのがどのように移植可能かわかりません。 – Barmar

1
find /directory -name "*pattern*" | xargs awk '{z=FILENAME".txt";print $8>z}' 
関連する問題