40

多くの情報筋によると、{} のすべてのインスタンスは検索で見つかったファイル名に置き換えられますが、次を実行しようとすると、テキスト ファイルが 1 つしか取得されず、その名前は「.txt」です。

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

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

4

3 に答える 3

40

試す:

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

ただし、一部のバージョンの find は{}個別の引数である必要があり、{}それ以外の場合はファイル名に展開されないことに注意してください。あなたはそれを回避することができます:

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 文字を置き換えるか、変更せずに文字列を使用するかは実装定義です。

于 2012-10-18T23:49:36.953 に答える
16

William Pursell が回答で言及した警告に対処するには、次を使用します。

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

を使用するsh -cと、実行する文字列に続く引数から位置パラメータが取得されます。エクストラxは で埋められ$0、置換されたファイル名は になり$1ます。

二重引用符を使用すると、スペースやその他の特殊文字を含むファイル名でこれが適切に機能します。

于 2012-10-19T00:13:22.457 に答える