1

ファイルから入力を取得し、stdout に出力するように設計された c++ で実行可能ファイルを作成しました (単一のファイルにリダイレクトしたい)。問題は、フォルダー内のすべてのファイルに対してこれを実行したいのですが、使用している検索コマンドが連携していないことです。私が使用しているコマンドは次のとおりです。

find -name files/* -exec ./stagger < {} \;

例を見ると、{} がファイル名に置き換わっていることがわかります。ただし、次のエラーが表示されます。

-bash: {}: No such file or directory

これが解決されたら、すべての結果を 1 つのファイルにまとめるには、Command >> outputfile.txt というパターンを使用するだけでよいと思います。

ご協力ありがとうございます。質問が明確になるかどうかお知らせください。

4

3 に答える 3

4

あなたが抱えている問題は、findコマンドの前にリダイレクトが処理されることです。これを回避するには、-exec呼び出しで別のbashプロセスを生成します。

find files/* -exec bash -c '/path/to/stagger < "$1"' -- {} \;
于 2012-07-05T20:42:11.927 に答える
2
  1. オペレーターは、<コマンドを実行する前に、シェルによってリダイレクトとして解釈されます。シェルは という名前のファイルからの入力を の stdin にリダイレクトしよう{}findしますが、ファイルが存在しない場合はエラーが発生します。

  2. への引数-nameは引用符で囲まれておらず、グロブ文字が含まれています。シェルはパス名展開を適用し、無意味な引数を find に与えます。

  3. ファイル名にスラッシュを含めることはできません。への引数-nameは引用されていても機能しません。GNU find が利用可能な場合は-path、glob パターンを指定するために使用できますfiles/*が、これは「files という名前のディレクトリ内のファイル」を意味するものではありません-regex。ポータブル ソリューションはより困難です。

  4. 開始するパスを 1 つ以上指定する必要がありますfind

あなたが本当に望んでいたのは、シェルにリダイレクトを実行させることだったと仮定すると、GNU find を使用する方法は次のとおりです。

find . -type f -regex '.*foo/[^/]*$' -exec sh -c 'for x; do ./stagger <"$x"; done' -- {} +

これはおそらく最も移植性の高い方法ですfind(この場合は機能-depth-pruneません)。

find . -type d -name files -exec sh -c 'for x; do for y in "$x"/*; do [ -f "$y" ] && ./stagger <"$y"; done; done' -- {} +

globstarBash を使用している場合、この問題は の代わりにパターンを使用するための非常に良い候補ですfind

#!/usr/bin/env bash
shopt -s extglob globstar nullglob

for x in **/files/*; do
    [[ -f "$x" ]] && ./stagger <"$x"
done
于 2012-07-06T11:39:41.377 に答える
0

単純に小なり記号をエスケープして、リダイレクトが実行されているシェルではなく、findコマンドによって実行されるようにします。

find files/* -exec ./stagger \< {} \;
于 2012-07-05T20:45:32.657 に答える