xargs コマンドで > を使用するにはどうすればいいですか? 質問する

xargs コマンドで > を使用するにはどうすればいいですか? 質問する

ディレクトリ内のすべてのファイルをgrepし、そのgrepの出力を別のファイルに書き込むことができるbashコマンドを見つけたいです。私の推測では、次のようなものになると思います。

ls -1 | xargs -I{} "grep ABC '{}' > '{}'.out"

しかし、私の知る限り、xargs は二重引用符を好みません。ただし、二重引用符を削除すると、コマンド全体の出力が、一連の個別のファイルではなく、'{}'.out という単一のファイルにリダイレクトされます。

xargs を使用してこれを行う方法をご存知の方はいませんか? この grep シナリオは、xargs に関する問題を説明するための例として使用しただけなので、xargs を使用しない解決策は私には当てはまりません。

ベストアンサー1

次のような間違いをしないでください。

sh -c "grep ABC {} > {}.out"

これは、奇妙なファイル名を含む多くの状況で機能しなくなり、正しく引用符で囲むことが不可能になります。{}コード インジェクション バグを回避するには、コマンドには常に 1 つの完全に独立した引数を指定する必要があります。必要な操作は次のとおりです。

xargs -I{} sh -c 'grep ABC "$1" > "$1.out"' -- {}

xargsおよびに適用されますfind

ちなみに、-0オプションなしで xargs を使用しないでください (データが破壊されることを心配しない、非常にまれで制御された 1 回限りの対話型使用の場合を除く)。

また、解析しないでくださいls。決して。find代わりにグロブを使用してください:http://mywiki.wooledge.org/ParsingLs

再帰を必要とするものすべてに使用しfind、その他すべてには glob を使用した単純なループを使用します。

find /foo -exec sh -c 'grep "$1" > "$1.out"' -- {} \;

または非再帰的:

for file in *; do grep "$file" > "$file.out"; done

引用符の適切な使用に注意してください。

おすすめ記事